1. ホーム
  2. sql

[解決済み】"空白またはヌル値 "をチェックする最適な方法

2022-04-21 17:03:32

質問

Postgres の SQL 文で、値が NULL または空文字列であるかどうかを確認する最良の方法は何ですか?

値は長い式になることがあるので、チェックの際に一度だけ書くことが望ましいです。

現在、私が使っているのは

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

でも、ちょっと不格好ですね。

stringexpression かもしれません char(n) を含む列または式 char(n) 列の末尾に空白を含む。

最適な方法は何ですか?

解決方法は?

式は stringexpression = '' が得られます。

TRUE   ... '' (または 任意 空白文字のみで構成される文字列で、データ型は 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) , varchar , text または "char" (ダブルクオートを使用)。

char(n) an 空の文字列 は、空白のみからなる他の文字列と変わりはありません。これらはすべて、折りたたんで 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|f|f|f|f
                  | t|t|t|t|t|t|t|t|t|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 a sane character types
   , (NULL)
   ) sub(stringexpression);

結果

 文字列表現|ベーステスト|テスト1|テスト2|コアレッセンス1|コアレッセンス2|コアレッセンス3 
------------------+-----------+-------+-------+-----------+-----------+-----------
 foo|f|f|f|f|f|f|f|f|f|f
                  | t|t|t|t|t|f|f|f
                  | f|f|f|f|f|f|f|f|f
 

ヌル

             | 

ヌル

      | t|t|t|t|f|f

db<>フィドル これ

<サブ 古い sqlfiddle

関連