web-dev-qa-db-ja.com

MySQLのこの演算子<=>とは何ですか?

私は前の開発者によって書かれたコードに取り組んでおり、それはクエリで、

WHERE p.name <=> NULL

このクエリで<=>はどういう意味ですか? =に等しいものですか?それとも構文エラーですか?

ただし、エラーや例外は表示されません。私はすでに<> = != in MySQL であることを知っています。

147
zzlalani

=演算子との類似点

通常の=演算子と同様に、2つの値が比較され、結果は0(等しくない)または1(等しい)のいずれかです。つまり、'a' <=> 'b'0を生成し、'a' <=> 'a'1を生成します。

=演算子との違い

通常の=演算子とは異なり、NULLの値には特別な意味はないため、可能な結果としてNULLを生成することはありません。 so:'a' <=> NULL0を生成し、NULL <=> NULL1を生成します。

=とは異なり、'a' = NULLNULLを生成し、さらにNULL = NULLNULLを生成します。ところで、NULLとの比較は基本的に未定義なので、MySQLのほとんどすべての演算子と関数はこの方法で動作します。

使いやすさ

これは、両方のオペランドにNULLが含まれ、2つの列間で一貫した比較結果が必要な場合に非常に便利です。

別のユースケースは、準備されたステートメントを使用する場合です。次に例を示します。

... WHERE col_a <=> ? ...

ここで、プレースホルダーはスカラー値またはNULLのいずれかであり、クエリについて何も変更する必要はありません。

関連する演算子

<=>の他に、NULLと比較するために使用できる2つの演算子、つまりIS NULLIS NOT NULLもあります。これらはANSI標準の一部であるため、MySQL固有の<=>とは異なり、他のデータベースでサポートされています。

MySQLの<=>の特殊化と考えることができます。

'a' IS NULL     ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)

これに基づいて、特定のクエリ(フラグメント)をよりポータブルに変換できます。

WHERE p.name IS NULL
214
Ja͢ck

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);
55
Drixson Oseña

それはNULL-safe演算子に等しい

<=>演算子を使用して、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 < =>も同様に

補足説明:-

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
24
Rahul Tripathi

<=>は、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
18
Ed Cottrell

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
11
Dimag Kharab

<=>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 <=> NULLWHERE p.name IS NULLと同じです。

10
Salman A

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を決して返しません。

9
Jojodmo

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 |
1
zloctb