sql >> データベース >  >> RDS >> Mysql

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

    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
    


    1. SQLiteの結果をテーブルとしてフォーマットする方法

    2. PostgreSQLでのVACUUM処理の概要

    3. Oracle Dynamic Pivoting

    4. コマンドラインを使用してLinux上にMySQLユーザーを作成する