Výraz stringexpression = ''
výnosy:
TRUE
.. pro ''
(nebo pro libovolné řetězec skládající se pouze z mezer s datovým typem char(n)
)NULL
.. pro NULL
FALSE
.. na cokoli jiného
Takže pro kontrolu:"stringexpression
je buď NULL, nebo prázdný" :
(stringexpression = '') IS NOT FALSE
Nebo opačný přístup (může být lépe čitelný):
(stringexpression <> '') IS NOT TRUE
Funguje pro jakýkoli typ znaku včetně char(n)
. Manuál o operátorech porovnání.
Nebo použijte svůj původní výraz bez trim()
, což je pro char(n)
nákladný šum (viz níže), nebo nesprávné pro jiné typy znaků:řetězce obsahující pouze mezery by prošly jako prázdný řetězec.
coalesce(stringexpression, '') = ''
Ale výrazy nahoře jsou rychlejší.
Tvrdit opak je ještě jednodušší:"stringexpression
není NULL ani prázdný" :
stringexpression <> ''
O char(n)
Jedná se o datový typ char(n)
, zkratka pro:character(n)
. (char
/ character
jsou zkratky pro char(1)
/ character(1)
.) Jeho použití se v Postgresu nedoporučuje:
Ve většině situací
text
nebocharacter varying
by měl být použit místo toho.
Nezaměňujte char(n)
s dalšími užitečnými typy znaků varchar(n)
, varchar
, text
nebo "char"
(s dvojitými uvozovkami).
V char(n)
prázdný řetězec se neliší od jakéhokoli jiného řetězce sestávajícího pouze z mezer. Všechny jsou složeny na n mezery v char(n)
podle definice typu. Z toho logicky vyplývá, že výše uvedené výrazy fungují pro char(n)
stejně tak - stejně jako tyto (což by nefungovalo pro jiné typy postav):
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
Ukázka
Prázdný řetězec se při přetypování na char(n)
rovná libovolnému řetězci mezer :
SELECT ''::char(5) = ''::char(5) AS eq1
, ''::char(5) = ' '::char(5) AS eq2
, ''::char(5) = ' '::char(5) AS eq3;
Výsledek:
eq1 | eq2 | eq3
----+-----+----
t | t | t
Otestujte „nulový nebo prázdný řetězec“ 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);
Výsledek:
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
Otestujte „nulový nebo prázdný řetězec“ 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);
Výsledek:
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<>zde hrajte
Starý sqlfiddle
Související:
- Nějaké nevýhody používání datového typu "text" pro ukládání řetězců?