Postgres SQL ステートメントで値が null または空の文字列であるかどうかを確認する最適な方法は何ですか?
値は長い表現になる可能性があるため、チェック時に 1 回だけ記述することが望ましいです。
現在使用しているもの:
coalesce( trim(stringexpression),'')=''
でも見た目はちょっと醜いですね。
stringexpression
末尾にスペースがあるchar(n)
列または列を含む式である可能性があります。char(n)
最善の方法は何ですか?
ベストアンサー1
この式は次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
歴史的な理由と SQL 標準との互換性のためにサポートされていますが、その使用はcharacter
char(1)
character(1)
bpchar
character
Postgresでは推奨されない:
ほとんどの場合、代わりに
text
または をcharacter varying
使用する必要があります。
char(n)
他の便利な文字タイプと混同しないでくださいvarchar(n)
、varchar
、text
または"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
関連している: