Выражение 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является ни пустым, ни пустым» :
stringexpression <> ''
Речь идет о типе данных 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):
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);
Результат:
строковое выражение | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3
------------------ + ----------- + ------- + ------- + --- -------- + ----------- + -----------
фу | f | f | f | f | f | е
| т | т | т | т | т | T
| т | т | т | т | т | T
ноль | ноль | т | т | т | т | T
Проверка на "нулевую или пустую строку" с 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);
Результат:
строковое выражение | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3
------------------ + ----------- + ------- + ------- + --- -------- + ----------- + -----------
фу | f | f | f | f | f | е
| т | т | т | т | f | е
| f | f | f | f | f | е
ноль | ноль | т | т | т | т | е
db <> скрипеть здесь
Old sqlfiddle
Связанный:
charпочти всегда является неправильным выбором из-за заполнения (и в результате космического мусора). Но кроме этого: я не думаю, что есть лучшее решение.