私は前の開発者によって書かれたコードに取り組んでおり、それはクエリで、
WHERE p.name <=> NULL
このクエリで<=>
はどういう意味ですか? =
に等しいものですか?それとも構文エラーですか?
ただし、エラーや例外は表示されません。私はすでに<>
= !=
in MySQL であることを知っています。
=
演算子との類似点通常の=
演算子と同様に、2つの値が比較され、結果は0
(等しくない)または1
(等しい)のいずれかです。つまり、'a' <=> 'b'
は0
を生成し、'a' <=> 'a'
は1
を生成します。
=
演算子との違い通常の=
演算子とは異なり、NULL
の値には特別な意味はないため、可能な結果としてNULL
を生成することはありません。 so:'a' <=> NULL
は0
を生成し、NULL <=> NULL
は1
を生成します。
=
とは異なり、'a' = NULL
はNULL
を生成し、さらにNULL = NULL
はNULL
を生成します。ところで、NULL
との比較は基本的に未定義なので、MySQLのほとんどすべての演算子と関数はこの方法で動作します。
これは、両方のオペランドにNULL
が含まれ、2つの列間で一貫した比較結果が必要な場合に非常に便利です。
別のユースケースは、準備されたステートメントを使用する場合です。次に例を示します。
... WHERE col_a <=> ? ...
ここで、プレースホルダーはスカラー値またはNULL
のいずれかであり、クエリについて何も変更する必要はありません。
<=>
の他に、NULL
と比較するために使用できる2つの演算子、つまり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
is<=>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 < =>も同様に)
補足説明:-
NULL値をフィールドと比較するために使用されるもう1つのポイントNOT <=>があります。通常の!=または<>(等しくない)の場合、比較値の1つがNULLの場合、演算子はNULLを返します。 <=>にNOTを適用すると、trueまたはfalseが返されます。 <=>演算子に適用されない演算子は、IS NOT NULLと同じです。
例:-
SELECT NULL != NULL, //--Result is NULL
NOT NULL <=> NULL, //--Result is 0
NULL IS NOT NULL; //--Result is 0
<=>
は、MySQLのnullセーフな「等しい」演算子です。 マニュアルから :
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ではなく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ではない)を返し、一方の値がNULLの場合は0(NULLではない)を返します。
例
SELECT NULL <=> NULL -- 1
SELECT TRUE <=> TRUE -- 1
SELECT col1 <=> col2 FROM myTable
<=>
は NULL-safeイコール演算子 です。 a <=> b
は次の記述と同じです。
CASE
WHEN a IS NULL AND b IS NULL THEN 1 -- both operands null then 1
WHEN a IS NULL OR b IS NULL THEN 0 -- one operand is null then 0
ELSE a = b -- else behave like normal = operator
END
申し訳ありませんが、AND/OR IS (NOT) NULL
の代わりにこの演算子を使用する理由を見つけることができませんでした。たとえば、WHERE p.name <=> NULL
はWHERE p.name IS NULL
と同じです。
MySQLドキュメント から:
NULLセーフイコール。この演算子は、=演算子のような等価比較を実行しますが、は、両方のオペランドがNULLの場合はNULLではなく1を返し、一方のオペランドがNULLの場合はNULLではなく0を返します。
<=>
演算子を使用した例は次のとおりです。
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
どちらが返されます:
1, 1, 0
通常の=
演算子の例は次のとおりです。
SELECT 1 = 1, NULL = NULL, 1 = NULL;
どちらが返されます:
1, NULL, NULL
<=>
演算子は=
演算子と非常に似ていますが、<=>
演算子はNULL
を決して返しません。
NULL-安全な等しい演算子です。 説明 を確認してください。
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 |