式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)
、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
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
関連:
- 文字列を格納するためにデータ型「テキスト」を使用することの欠点はありますか?