比較の演算の結果は、1
(
TRUE
) 、0
(
FALSE
) 、または NULL
の値になります。これらの演算は、数字とストリングの両方に適応します。必要に応じて、ストリングは数字に、数字はストリングに自動的に変換されます。
このセクションの関数のうちには、1
( TRUE
) 、0
(
FALSE
) 、または NULL
以外の値を戻すものもあります。LEAST()
および GREATEST()
などがその例です。しかし、それらが戻す値は、項11.1.2. 「式評価でのタイプ変換」
で説明されているルールによって行われた比較の演算に基づいています。
比較のために値を特定のタイプに変換するには、CAST()
関数を使用することができます。ストリング値は、CONVERT()
を使用して、異なる文字セットに変換することが可能です。項11.8. 「キャスト関数と演算子」
を参照してください。
デフォルトによって、文字比較は大文字小文字の区別の必要はなく、現在の文字セットを使用します。デフォルトは
latin1
( cp1252 West European ) で、English
でも正常に作用します。
等しい :
mysql>SELECT 1 = 0;
-> 0 mysql>SELECT '0' = 0;
-> 1 mysql>SELECT '0.0' = 0;
-> 1 mysql>SELECT '0.01' = 0;
-> 0 mysql>SELECT '.01' = 0.01;
-> 1
NULL
-
安全等価。この演算は、=
演算子のように、等価比較を行いますが、両方のオペランドが
NULL
であれば、NULL
でなく
1
を戻し、一方のオペランドが
NULL
の場合は、NULL
でなく
0
を戻します。
mysql>SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
-> 1, 1, 0 mysql>SELECT 1 = 1, NULL = NULL, 1 = NULL;
-> 1, NULL, NULL
等しくない :
mysql>SELECT '.01' <> '0.01';
-> 1 mysql>SELECT .01 <> '0.01';
-> 0 mysql>SELECT 'zapp' <> 'zappp';
-> 1
より少ないか等しい :
mysql> SELECT 0.1 <= 2;
-> 1
より少ない :
mysql> SELECT 2 < 2;
-> 0
より多いか等しい :
mysql> SELECT 2 >= 2;
-> 1
より多い :
mysql> SELECT 2 > 2;
-> 0
IS
,
boolean_value
IS NOT
boolean_value
boolean_value
が
TRUE
か FALSE
、または UNKNOWN
になり得る、ブーリアン値に対して値をテストします。
mysql>SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
-> 1, 1, 1 mysql>SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
-> 1, 1, 0
値が NULL
であるか否かをテストします。
mysql>SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
-> 0, 0, 1 mysql>SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
-> 1, 1, 0
ODBC
プログラムとうまく適合させるため、IS
NULL
を使用する場合、MySQL
は次の追加機能をサポートします :
一番最近の AUTO_INCREMENT
値を含む行を、その値を生成した直後に、次のフォームのステートメントを発行することによって検索することができます
:
SELECT * FROMtbl_name
WHEREauto_col
IS NULL
この動作は、SQL_AUTO_IS_NULL=0
を設定すると無効になります。項12.5.3. 「SET
構文」
を参照してください。
NOT NULL
として宣言された
DATE
および
DATETIME
カラムでは、次のようなステートメントを使用することで、特殊な日付
'0000-00-00'
を検索することができます :
SELECT * FROMtbl_name
WHEREdate_column
IS NULL
ODBC は '0000-00-00'
をサポートしていないため、ODBC
アプリケーションのあるものの作動にこれが必要になります。
expr
が
min
より多いか等しく、expr
が max
より少ないか等しい場合、BETWEEN
は 1
を戻し、それ以外では
0
を戻します。すべての引数が同じタイプの場合は、これは式
(
と等価になります。もしくは、項11.1.2. 「式評価でのタイプ変換」
にあるルールによってタイプ変換が実施されますが、3つすべての引数に適用されます。
min
<=
expr
AND
expr
<=
max
)
mysql>SELECT 1 BETWEEN 2 AND 3;
-> 0 mysql>SELECT 'b' BETWEEN 'a' AND 'c';
-> 1 mysql>SELECT 2 BETWEEN 2 AND '3';
-> 1 mysql>SELECT 2 BETWEEN 2 AND 'x-3';
-> 0
BETWEEN
を日付値または時刻値と使用する場合に最善の結果を得るには、値を所望のデータ
タイプに明示的に変換するため、CAST()
を使用します。例 : DATETIME
をふたつの DATE
値と比較する場合、DATE
値を
DATETIME
値に変換します。'2001-1-1'
のようなストリング定数を、DATE
との比較で使用する場合、ストリングを
DATE
にキャストします。
これは、NOT (
と同様です。
expr
BETWEEN min
AND
max
)
リストの最初の非 NULL
値を戻すか、非 NULL
値がない場合は NULL
を戻します。
mysql>SELECT COALESCE(NULL,1);
-> 1 mysql>SELECT COALESCE(NULL,NULL,NULL);
-> NULL
引数ふたつ以上では、最大の ( 最大値の )
引数を戻します。それらの引数は、LEAST()
に対するものと同じルールで比較されます。
mysql>SELECT GREATEST(2,0);
-> 2 mysql>SELECT GREATEST(34.0,3.0,5.0,767.0);
-> 767.0 mysql>SELECT GREATEST('B','A','C');
-> 'C'
引数のどれかが NULL
である場合、GREATEST()
は
NULL
を戻します。
expr
が、IN
リストのどれかの値と等しい場合は
1
を戻し、それ以外では
0
を戻します。すべての値が定数の場合、expr
のタイプに基づいて評価し、分類します。その際の項目の検索は、バイナリ検索を使って行われます。これはつまり、IN
は、IN
値のリストがすべて定数で構成されている場合、非常に速いということです。もしくは、項11.1.2. 「式評価でのタイプ変換」
にあるルールによってタイプ変換が実施されますが、すべての引数に適用されます。
mysql>SELECT 2 IN (0,3,5,7);
-> 0 mysql>SELECT 'wefwf' IN ('wee','wefwf','weg');
-> 1
引用符で括られた値 ( ストリングなど )
と括られていない値 ( 数字など )
の比較ルールは異なるため、IN
リストの引用符で括られた値と、括られていない値を決して混同しないでください。タイプの混同は、上記の理由により、結果の矛盾の原因になることがあります。例えば、IN
式を次のようには書かないでください :
SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');
正しい書き方はこのようになります :
SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');
IN
リストの値の数は、max_allowed_packet
値によってのみ制限されます。
SQL の標準に準拠するため、IN
は、左側の式が NULL
である場合だけでなく、リストに一致するものがない場合、また、リストの式のひとつが
NULL
である場合にも、NULL
を戻します。
IN()
構文は、ある種の副問い合わせを書くのにも使用できます。項12.2.8.3. 「ANY
、IN
、そして
SOME
を持つサブクエリ」
を参照してください。
これは、NOT (
と同様です。
expr
IN
(value
,...))
expr
が NULL
の場合、ISNULL()
は
1
を戻し、それ以外では
0
を戻します。
mysql>SELECT ISNULL(1+1);
-> 0 mysql>SELECT ISNULL(1/0);
-> 1
=
の代わりに、ISNULL()
を使って、値が NULL
であるかテストすることができます。(
=
で値を NULL
と比較すると、常に false が生じます。)
ISNULL()
関数は IS
NULL
比較演算子と、いくつかの特殊な動作を共有します。IS
NULL
の解説を参照してください。
N
<
N1
の場合は
0
を、N
<
N2
の場合は
1
を戻す、というように続き、また
N
が NULL
の場合は -1
を戻します。すべての引数は整数として扱われます。この関数の
N1
<
N2
<
N3
< ...
< Nn
が正しく作動することは必須条件です。これは、バイナリ検索が使用されていることが理由です
( 高速 ) 。
mysql>SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
-> 3 mysql>SELECT INTERVAL(10, 1, 10, 100, 1000);
-> 2 mysql>SELECT INTERVAL(22, 23, 30, 44, 200);
-> 0
引数ふたつ以上では、最小の ( 最小値の ) 引数を戻します。引数は次のルールを使用して比較されます :
戻り値が INTEGER
文脈で使用されている場合、またはすべての引数が整数値である場合、それらは整数として比較されます。
戻り値が REAL
文脈で使用されている場合、またはすべての引数が実数値である場合、それらは実数として比較されます。
引数のいずれかが大文字小文字の区別のあるストリングである場合、引数は大文字小文字の区別のあるストリングとして比較されます。
他のすべてのケースでは、引数は大文字小文字の区別のあるストリングとして比較されます。
引数のどれかが NULL
である場合、LEAST()
は
NULL
を戻します。
mysql>SELECT LEAST(2,0);
-> 0 mysql>SELECT LEAST(34.0,3.0,5.0,767.0);
-> 3.0 mysql>SELECT LEAST('B','A','C');
-> 'A'
上記の変換ルールは、いくつかの境界例では異常な結果を引き起こす場合がありますのでご注意ください :
mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED);
-> -9223372036854775808
これは、MySQL が
9223372036854775808.09223372036854775808.0
を整数の文脈で読み取ることが原因で起こります。整数表記は値を保持するのに十分ではないので、符号付整数にラップします。