Wyrażenie stringexpression = ''
plony:
TRUE
.. dla ''
(lub dla dowolnego ciąg składający się tylko ze spacji o typie danych char(n)
)NULL
.. dla NULL
FALSE
.. na cokolwiek innego
Aby sprawdzić:"stringexpression
ma wartość NULL lub jest pusta” :
(stringexpression = '') IS NOT FALSE
Lub odwrotne podejście (może być łatwiejsze do odczytania):
(stringexpression <> '') IS NOT TRUE
Działa dla każdego typu znaku, w tym char(n)
. Podręcznik dotyczący operatorów porównania.
Lub użyj oryginalnego wyrażenia bez trim()
, co jest kosztownym szumem dla char(n)
(patrz poniżej) lub niepoprawne dla innych typów znaków:ciągi składające się tylko ze spacji będą przekazywane jako ciąg pusty.
coalesce(stringexpression, '') = ''
Ale wyrażenia na górze są szybsze.
Stwierdzenie czegoś przeciwnego jest jeszcze prostsze:"stringexpression
nie jest ani NULL, ani pusty” :
stringexpression <> ''
O char(n)
Chodzi o typ danych char(n)
, skrót od:character(n)
. (char
/ char
są skrótami od char(1)
/ character(1)
.) Odradza się jego używanie w Postgresie:
W większości sytuacji text
lub character varying
powinno być używane zamiast tego.
Nie myl char(n)
z innymi, użytecznymi typami znaków varchar(n)
, varchar
, text
lub "char"
(z podwójnymi cudzysłowami).
W char(n)
pusty ciąg nie różni się od innych napisów składających się tylko ze spacji. Wszystkie są złożone do n spacje w char(n)
zgodnie z definicją typu. Wynika z tego logicznie, że powyższe wyrażenia działają dla char(n)
jak również - tak samo jak te (które nie działają dla innych typów postaci):
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
Demo
Pusty ciąg równa się dowolnemu ciągowi spacji podczas rzutowania na char(n)
:
SELECT ''::char(5) = ''::char(5) AS eq1
, ''::char(5) = ' '::char(5) AS eq2
, ''::char(5) = ' '::char(5) AS eq3;
Wynik:
eq1 | eq2 | eq3
----+-----+----
t | t | t
Przetestuj pod kątem „pustego lub zerowego ciągu” za pomocą 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);
Wynik:
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
Przetestuj „pusty lub zerowy ciąg” za pomocą 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);
Wynik:
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<>graj tutaj
Stary sqlfiddle
Powiązane:
- Jakieś wady używania typu danych „tekst” do przechowywania ciągów?