以前の開発者が書いたコードに取り組んでいるのですが、クエリに次のように書かれています。
WHERE p.name <=> NULL
このクエリの はどういう<=>
意味ですか? と等しいものなのでしょうか=
? それとも構文エラーでしょうか?
しかし、エラーや例外は表示されません。<>
=は既にわかっています!=
。マイグレーション。
ベストアンサー1
要約
それはNULL
安全で平等オペレーター。
通常の=
演算子と同様に、 2 つの値が比較され、結果は0
(等しくない) または1
(等しい) のいずれかになります。つまり、および が'a' <=> 'b'
生成されます。0
'a' <=> 'a'
1
通常の=
演算子とは異なり、 の値にはNULL
特別な意味がないため、 がNULL
結果として得られることはありません。つまり、'a' <=> NULL
は を生成し0
、NULL <=> NULL
は を生成します1
。
使いやすさ
NULL
これは、両方のオペランドが含まれている可能性があり、2 つの列間で一貫した比較結果が必要な場合に役立ちます。
もう 1 つの使用例は、準備されたステートメントを使用する場合です。次に例を示します。
... 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