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