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?