Изразът 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 / 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);
Резултат:
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 :
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
Свързано:
- Някакви недостатъци при използването на тип данни „текст“ за съхранение на низове?