私は以前の開発者によって書かれたコードに取り組んでおり、クエリでは、
WHERE p.name <=> NULL
<=>
このクエリの意味は何ですか?それは等しいもの=
ですか?それとも構文エラーですか?
私は以前の開発者によって書かれたコードに取り組んでおり、クエリでは、
WHERE p.name <=> NULL
<=>
このクエリの意味は何ですか?それは等しいもの=
ですか?それとも構文エラーですか?
回答:
それはだNULL
、安全等しい演算子。
通常の=
演算子と同様に、2つの値が比較され、結果は(等しく0
ない)または1
(等しい)になります。つまり、'a' <=> 'b'
yields 0
と'a' <=> 'a'
yields 1
です。
通常の=
演算子とは異なり、の値にNULL
は特別な意味がないためNULL
、可能な結果として得られることはありません。so:'a' <=> NULL
yields 0
およびNULL <=> NULL
yields 1
。
これは、両方のオペランドに含まれる可能性がNULL
あり、2つの列間で一貫した比較結果が必要な場合に役立ちます。
別の使用例は、準備されたステートメントを使用する場合です。次に例を示します。
... WHERE col_a <=> ? ...
ここで、プレースホルダーはスカラー値にNULL
することも、クエリについて何も変更する必要がないこともあります。
それに加えて、<=>
と比較するために使用できる他の2つの演算子もあります。それらはANSI標準の一部であり、MySQL固有のとは異なり、他のデータベースでサポートされています。NULL
IS NULL
IS NOT NULL
<=>
あなたはそれらを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
<=>
はやや役に立たない演算子ですか?正しい?
<=>
2つのオペランドを取りますが、IS (NOT) NULL
1つだけを取ります。大きな違い... =
それはその点でそれ自体と同じくらい有用です。
IS NULL
およびIS NOT NULL
SQL標準に含まれています。<=>
MySQL固有の拡張機能です。
is not distinct from
演算子のように。MySQLがその上でインデックスを使用できるかどうか知りたいと思っています...
a <=> b
ですNOT(a <=> b)
。
は<=> NULL-safe equal to operator
この演算子は=演算子のように等価比較を実行しますが、両方のオペランドがNULLの場合はNULLではなく1を返し、一方のオペランドがNULLの場合はNULLではなく0を返します。
ドキュメントはこちら
サンプル :
IS NOT NULLを使用する必要があります。(比較演算子=と<>はどちらも、式のいずれかの側でUNKNOWNにNULLを指定します。)
SELECT *
FROM table
WHERE YourColumn IS NOT NULL;
null安全な等価演算子を無効にすることもできますが、これは標準SQLではありません。
SELECT *
FROM table
WHERE NOT (YourColumn <=> NULL);
<=>演算子は、NULL値とフィールドを比較するために使用されます。通常=(等しい)の場合、比較値の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
編集: - (非常に遅く言及一つの重要な側面のメモを追加することが<=>しないとしても)
余談:-
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
NOT <=>
は演算子ではないNOT
ため、の結果に適用されop1 <=> op2
ます。
<!=>
演算子がないと思います
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セーフ等しい演算子は。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
申し訳ありませんが、この演算子をの代わりに使用する理由が1つも見つかりませんでした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 |
spaceship
オペレータ