181

私は以前の開発者によって書かれたコードに取り組んでおり、クエリには次のように書かれています。

WHERE p.name <=> NULL

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

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

4

10 に答える 10

264

TL;DR

これはNULL安全な等号演算子です。

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

=通常の演算子とは異なり、の値にNULLは特別な意味がないためNULL、可能な結果として生じることはありません。so: 'a' <=> NULLyields0NULL <=> NULLyields 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
于 2014-02-21T07:56:08.593 に答える
63

<=> 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);
于 2014-02-21T06:41:40.297 に答える
30

これはNULL セーフの equal to 演算子です

<=> 演算子は、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
于 2014-02-21T06:43:07.443 に答える
12

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
于 2014-02-21T06:42:55.063 に答える
5

これは NULL - Safe Equal to 演算子です。説明を確認してください。

于 2014-02-21T06:42:52.430 に答える
1
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 |
于 2016-02-27T10:44:25.187 に答える