TL; DR
これは、 NULL
> 安全な同等
オペレーター。
通常の=
のように 演算子の場合、2つの値が比較され、結果は0
のいずれかになります。 (等しくない)または1
(同等);言い換えれば、'a' <=> 'b'
0
を生成します および'a' <=> 'a'
1
を生成します 。
通常の=
とは異なり 演算子、NULL
の値 特別な意味はないため、NULL
は生成されません。 可能な結果として;したがって:'a' <=> NULL
0
を生成します およびNULL <=> NULL
1
を生成します 。
有用性
これは、両方のオペランドに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
サポート
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