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

空またはnull値をチェックするための最良の方法

    stringexpression = '' 収量:

    TRUE .. for '' (または任意 データ型がchar(n)のスペースのみで構成される文字列 )
    NULL .. NULLの場合
    FALSE ..その他の場合

    したがって、次のことを確認します: "stringexpression NULLまたは空のいずれかです」

    (stringexpression = '') IS NOT FALSE
    

    または逆のアプローチ(読みやすいかもしれません):

    (stringexpression <> '') IS NOT TRUE
    

    char(n)を含むすべての文字タイプで機能します 。比較演算子に関するマニュアル。

    または trim()を使用せずに元の式を使用する 、これはchar(n)にとってコストのかかるノイズです (以下を参照)、または他の文字タイプでは正しくありません。スペースのみで構成される文字列は、空の文字列として渡されます。

    coalesce(stringexpression, '') = ''
    

    ただし、上部の式の方が高速です。

    反対の主張はさらに簡単です: "stringexpression NULLでも空でもありません」

    stringexpression <> ''
    

    char(n)について

    これは、データ型char(n)に関するものです。 、略称:character(n) 。 (char /character char(1)の略です / character(1) 。)Postgresではその使用は推奨されていません:

    ほとんどの場合、text またはcharacter varying 代わりに使用する必要があります。

    char(n)を混同しないでください 他の便利な文字タイプvarchar(n)varchartext または"char" (二重引用符付き)。

    char(n)空の文字列 スペースのみで構成される他の文字列と違いはありません。これらはすべてnに折りたたまれています char(n)のスペース タイプの定義ごと。論理的には、上記の式はchar(n)に対して機能します。 同様に-これらと同じくらい(他の文字タイプでは機能しません):

    coalesce(stringexpression, '  ') = '  '
    coalesce(stringexpression, '') = '       '
    

    デモ

    char(n)にキャストすると、空の文字列はスペースの任意の文字列と等しくなります :

    SELECT ''::char(5) = ''::char(5)     AS eq1
         , ''::char(5) = '  '::char(5)   AS eq2
         , ''::char(5) = '    '::char(5) AS eq3;
    

    結果:

     eq1 | eq2 | eq3
     ----+-----+----
     t   | t   | t
    

    char(n)を使用して「nullまたは空の文字列」をテストします :

    SELECT stringexpression 
         , stringexpression = ''                   AS base_test
         , (stringexpression = '')  IS NOT FALSE   AS test1
         , (stringexpression <> '') IS NOT TRUE    AS test2
         , coalesce(stringexpression, '') = ''     AS coalesce1
         , coalesce(stringexpression, '  ') = '  ' AS coalesce2
         , coalesce(stringexpression, '') = '  '   AS coalesce3
    FROM  (
       VALUES
         ('foo'::char(5))
       , ('')
       , ('   ')                -- not different from '' in char(n)
       , (NULL)
       ) sub(stringexpression);
    

    結果:

     stringexpression | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3 
    ------------------+-----------+-------+-------+-----------+-----------+-----------
     foo              | f         | f     | f     | f         | f         | f
                      | t         | t     | t     | t         | t         | t
                      | t         | t     | t     | t         | t         | t
     null             | null      | t     | t     | t         | t         | t
    

    textを使用して「nullまたは空の文字列」をテストします :

    SELECT stringexpression 
         , stringexpression = ''                   AS base_test
         , (stringexpression = '')  IS NOT FALSE   AS test1
         , (stringexpression <> '') IS NOT TRUE    AS test2
         , coalesce(stringexpression, '') = ''     AS coalesce1
         , coalesce(stringexpression, '  ') = '  ' AS coalesce2
         , coalesce(stringexpression, '') = '  '   AS coalesce3
    FROM  (
       VALUES
         ('foo'::text)
       , ('')
       , ('   ')                -- different from '' in a sane character types
       , (NULL)
       ) sub(stringexpression);
    

    結果:

     stringexpression | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3 
    ------------------+-----------+-------+-------+-----------+-----------+-----------
     foo              | f         | f     | f     | f         | f         | f
                      | t         | t     | t     | t         | f         | f
                      | f         | f     | f     | f         | f         | f
     null             | null      | t     | t     | t         | t         | f
    

    db<>ここでフィドル
    古いsqlfiddle

    関連:

    • 文字列を格納するためにデータ型「テキスト」を使用することの欠点はありますか?


    1. レコードがテーブルに追加されたときに記録する日付/タイムスタンプ?

    2. PostgreSQLのクラウドデータベースオプションの比較

    3. MariaDBでRADIANS()がどのように機能するか

    4. SQLServerクエリでNULLを0に置き換える