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