私は以前の開発者によって書かれたコードに取り組んでおり、クエリには次のように書かれています。
WHERE p.name <=> NULL
<=>
このクエリの意味は何ですか? に等しいもの=
ですか?それとも構文エラーですか?
ただし、エラーや例外は表示されません。私はすでにそれを知っています<>
= MySQL。!=
私は以前の開発者によって書かれたコードに取り組んでおり、クエリには次のように書かれています。
WHERE p.name <=> NULL
<=>
このクエリの意味は何ですか? に等しいもの=
ですか?それとも構文エラーですか?
ただし、エラーや例外は表示されません。私はすでにそれを知っています<>
= MySQL。!=
これはNULL
安全な等号演算子です。
通常の=
演算子と同様に、2 つの値が比較され、結果は(0
等しくない) または1
(等しい) のいずれかになります。つまり、'a' <=> 'b'
yields0
と'a' <=> 'a'
yields1
です。
=
通常の演算子とは異なり、の値にNULL
は特別な意味がないためNULL
、可能な結果として生じることはありません。so: 'a' <=> NULL
yields0
とNULL <=> NULL
yields 1
.
NULL
これは、両方のオペランドに含まれる可能性があり、2 つの列間で一貫した比較結果が必要な場合に役立ちます。
別の使用例は、準備済みステートメントを使用する場合です。次に例を示します。
... WHERE col_a <=> ? ...
ここで、プレースホルダーはスカラー値NULL
にすることも、クエリについて何も変更する必要がないこともできます。
さらに<=>
、 と を比較するために使用できる他の 2 つの演算子もNULL
ありIS NULL
ますIS NOT NULL
。これらは ANSI 標準の一部であるため、<=>
MySQL 固有の とは異なり、他のデータベースでサポートされています。
これらは、MySQL の特殊化と考えることができます<=>
。
'a' IS NULL ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)
これに基づいて、特定のクエリ (フラグメント) をより移植性の高いものに変換できます。
WHERE p.name IS NULL
SQL:2003 標準<=>
では、次の形式で、MySQL の演算子とまったく同じように機能する述語が導入されました。
IS [NOT] DISTINCT FROM
以下は広くサポートされていますが、比較的複雑です。
CASE WHEN (a = b) or (a IS NULL AND b IS NULL)
THEN 1
ELSE 0
END = 1
は<=> NULL-safe equal to operator
この演算子は = 演算子と同様に等値比較を実行しますが、両方のオペランドが NULL の場合は NULL ではなく 1 を返し、一方のオペランドが NULL の場合は NULL ではなく 0 を返します。
ドキュメントについては、こちらを参照してください
サンプル :
IS NOT NULL を使用する必要があります。(比較演算子 = と <> は両方とも、式の両側に NULL がある UNKNOWN を返します。)
SELECT *
FROM table
WHERE YourColumn IS NOT NULL;
null 安全な等価演算子を否定することもできますが、これは標準 SQL ではありません。
SELECT *
FROM table
WHERE NOT (YourColumn <=> NULL);
<=> 演算子は、NULL 値とフィールドを比較するために使用されます。If normal =(equals) 比較値の 1 つが NULL の場合、演算子は NULL を返します。<=> 演算子を使用すると、true または false が返されます。<=> 演算子は IS 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
編集:-(NOT <=>について言及する重要な補足事項を1つ追加するのは非常に遅いですが)
補足:-
NULL 値をフィールドと比較するために使用されるNOT <=>がもう 1 つあります。通常の場合 != または <> (等しくない) 比較値の 1 つが NULL の場合、演算子は NULL を返します。<=> 演算子に NOT を適用すると、true または false が返されます。<=> 演算子に適用されない NOT は、IS NOT NULL と同じです。
例:-
SELECT NULL != NULL, //--Result is NULL
NOT NULL <=> NULL, //--Result is 0
NULL IS NOT NULL; //--Result is 0
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
その重要性:
NULL 値を非 NULL 値と比較すると、NULL になります。値がnullかどうかを確認したい場合。
NULL を通常の値と見なす等価演算子 (<=>) は、両方の値が NULL の場合は 1 (NULL ではない) を返し、値の 1 つが NULL の場合は 0 (NULL ではない) を返します。
例えば
SELECT NULL <=> NULL -- 1
SELECT TRUE <=> TRUE -- 1
SELECT col1 <=> col2 FROM myTable
これは NULL - Safe Equal to 演算子です。説明を確認してください。
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids = t.ids;
+----+------+----+------+
| id | ids | id | ids |
+----+------+----+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 5 | 6 | 5 | 6 |
| 6 | 7 | 6 | 7 |
+----+------+----+------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM t JOIN t2 WHERE t2.ids <=> t.ids;
+----+------+----+------+
| id | ids | id | ids |
+----+------+----+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 |
| 3 | NULL | 3 | NULL |
| 4 | NULL | 3 | NULL |
| 3 | NULL | 4 | NULL |
| 4 | NULL | 4 | NULL |
| 5 | 6 | 5 | 6 |
| 6 | 7 | 6 | 7 |