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