「空またはnull値」を確認する最良の方法 質問する

「空またはnull値」を確認する最良の方法 質問する

Postgres SQL ステートメントで値が null または空の文字列であるかどうかを確認する最適な方法は何ですか?

値は長い表現になる可能性があるため、チェック時に 1 回だけ記述することが望ましいです。

現在使用しているもの:

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

でも見た目はちょっと醜いですね。

stringexpression末尾にスペースがあるchar(n)列または列を含む式である可能性があります。char(n)

最善の方法は何ですか?

ベストアンサー1

この式は次stringexpression = ''のようになります。

true   .. ''(またはデータ型 のスペースのみで構成される任意char(n)の文字列)
null   .. null
false.. その他

stringexpressionnull または空です」

これを確認するには、次を使用します。

(stringexpression = '') IS NOT FALSE

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

(stringexpression <> '') IS NOT TRUE

どれでも使える文字の種類含むchar(n)
比較演算子に関するマニュアル。

または、オリジナルの表現をtrim()これは、(下記参照) にとってはコストのかかるノイズとなり、他の文字タイプにとっては不正確になりますchar(n)。スペースのみで構成される文字列は空の文字列として渡されます。

coalesce(stringexpression, '') = ''

しかし、上の表現の方が速いです。

stringexpressionnullでも空でもない」

反対を主張する方が簡単です:

stringexpression <> ''

いずれにしても、曖昧さの余地がある場合は、追加コメントに正確な意図を文書化してください。

についてchar(n)

データ型はchar(n). の短縮形ですcharacter(n)。/は/の短縮形です。は .の内部エイリアスです(「空白文字を追加した」と考えてください)このデータは、
char歴史的な理由と SQL 標準との互換性のためにサポートされていますが、その使用はcharacterchar(1)character(1)
bpcharcharacter
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

「null または空の文字列」をテストするには、次のようにしますchar(n)

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);

結果:

文字列式 | 基本テスト | テスト1 | テスト2 | 合体1 | 合体2 | 合体3
------------------+-----------+--------+----------+-----------+------------
 foo | f | f | f | f | f | f
                  | t | t | t | t | t | t
                  | t | t | t | t | t | t
 ヌル             |ヌル      | t | t | t | t | t

「null または空の文字列」をテストするには、次のようにしますtext

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 sane character types
   , (null)
   ) sub(stringexpression);

結果:

文字列式 | 基本テスト | テスト1 | テスト2 | 合体1 | 合体2 | 合体3
------------------+-----------+--------+----------+-----------+------------
 foo | f | f | f | f | f | f
                  | t | t | t | t | f | f
                  | f | f | f | f | f | f
 ヌル             |ヌル      | t | t | t | t | f

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

関連している:

おすすめ記事