Выражение 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
почти всегда является неправильным выбором из-за заполнения (и в результате космического мусора). Но кроме этого: я не думаю, что есть лучшее решение.