Udtrykket stringexpression = ''
giver:
TRUE
.. for ''
(eller for hvilken som helst streng, der kun består af mellemrum med datatypen char(n)
)NULL
.. for NULL
FALSE
.. til noget andet
Så for at tjekke efter:"stringexpression
er enten NULL eller tom" :
(stringexpression = '') IS NOT FALSE
Eller den omvendte tilgang (kan være lettere at læse):
(stringexpression <> '') IS NOT TRUE
Virker for enhver tegntype inklusive char(n)
. Manualen om sammenligningsoperatører.
Eller brug dit originale udtryk uden trim()
, hvilket er dyr støj for char(n)
(se nedenfor), eller forkert for andre tegntyper:strenge, der kun består af mellemrum, passerer som tom streng.
coalesce(stringexpression, '') = ''
Men udtrykkene i toppen er hurtigere.
At hævde det modsatte er endnu nemmere:"stringexpression
er hverken NULL eller tom" :
stringexpression <> ''
Om char(n)
Det handler om datatypen char(n)
, forkortelse for:character(n)
. (char
/ character
er en forkortelse for char(1)
/ character(1)
.) Dens brug frarådes i Postgres:
I de fleste situationer text
eller character varying
skal bruges i stedet.
Forveksle ikke char(n)
med andre nyttige tegntyper varchar(n)
, varchar
, text
eller "char"
(med dobbelte anførselstegn).
I char(n)
en tom streng er ikke forskellig fra enhver anden streng, der kun består af mellemrum. Alle disse er foldet til n mellemrum i char(n)
efter definition af typen. Det følger logisk, at ovenstående udtryk virker for char(n)
også - lige så meget som disse (som ikke ville fungere for andre karaktertyper):
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
Demo
Tom streng svarer til enhver streng af mellemrum, når den castes til char(n)
:
SELECT ''::char(5) = ''::char(5) AS eq1
, ''::char(5) = ' '::char(5) AS eq2
, ''::char(5) = ' '::char(5) AS eq3;
Resultat:
eq1 | eq2 | eq3
----+-----+----
t | t | t
Test for "nul eller tom streng" med 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);
Resultat:
stringexpression | base_test | test1 | test2 | samles1 | samles2 | samles3 ------------------+------------+-------+-------+-- ------------------+----------- 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
Test for "nul eller tom streng" med 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);
Resultat:
stringexpression | base_test | test1 | test2 | samles1 | samles2 | samles3 ------------------+------------+-------+-------+-- ------------------+----------- 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<>spil her
Gamle sqlfiddle
Relateret:
- Er der nogen ulemper ved at bruge datatypen "tekst" til at gemme strenge?