Wyrażenie stringexpression = ''
daje:
TRUE
.. for ''
(lub dla dowolnego łańcucha składającego się tylko ze spacji z typem danych char(n)
)
NULL
.. for NULL
FALSE
.. dla czegokolwiek innego
Aby więc sprawdzić: „ stringexpression
jest NULL lub pusty” :
(stringexpression = '') IS NOT FALSE
Lub odwrotne podejście (może być łatwiejsze do odczytania):
(stringexpression <> '') IS NOT TRUE
Działa dla każdego typu postaci, w tym char(n)
. Podręcznik o operatorach porównania.
Lub użyj oryginalnego wyrażenia bez trim()
, co jest kosztownym szumem char(n)
(patrz poniżej), lub niepoprawne dla innych typów znaków: łańcuchy zawierające tylko spacje byłyby traktowane jako pusty łańcuch.
coalesce(stringexpression, '') = ''
Ale wyrażenia na górze są szybsze.
Stwierdzenie czegoś przeciwnego jest jeszcze prostsze: „ stringexpression
nie ma wartości NULL ani pustej” :
stringexpression <> ''
Jest to o rodzaju danych char(n)
, skrót: character(n)
. ( char
/ character
są skrótem od char(1)
/ character(1)
.) Jego użycie jest odradzane w Postgres :
W większości sytuacji text
lub character varying
powinno być używane zamiast tego.
Nie należy mylić char(n)
z rodzaju inne, przydatne, charakter varchar(n)
, varchar
, text
lub"char"
(z podwójnych cudzysłowów).
W char(n)
na pusty ciąg nie różni się od jakiegokolwiek innego napisu, składające się tylko z przestrzeni. Wszystkie te elementy są składane do n spacji char(n)
zgodnie z definicją typu. Wynika z tego logicznie, że powyższe wyrażenia działają char(n)
również - tak samo jak te (które nie działałyby dla innych typów znaków):
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
Próbny
Pusty ciąg równa się dowolnemu ciągowi spacji, gdy jest rzutowany 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
Sprawdź „pusty lub pusty ciąg” 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 | fa
| t | t | t | t | t | t
| t | t | t | t | t | t
null | null | t | t | t | t | t
Sprawdź „pusty lub pusty 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 | fa
| t | t | t | t | f | fa
| f | f | f | f | f | fa
null | null | t | t | t | t | fa
db <> skrzypce tutaj
Stare sqlfiddle
Związane z:
char
jest prawie zawsze złym wyborem ze względu na wypełnienie (i wynikające z tego marnotrawstwo miejsca). Ale poza tym: nie sądzę, aby było lepsze rozwiązanie.