Uttrycket stringexpression = ''
ger:
TRUE
.. för ''
(eller för alla sträng som endast består av mellanslag med datatypen char(n)
)NULL
.. för NULL
FALSE
.. för allt annat
Så för att leta efter:"stringexpression
är antingen NULL eller tom" :
(stringexpression = '') IS NOT FALSE
Eller det omvända tillvägagångssättet (kan vara lättare att läsa):
(stringexpression <> '') IS NOT TRUE
Fungerar för alla teckentyper inklusive char(n)
. Manualen om jämförelseoperatörer.
Eller använd ditt ursprungliga uttryck utan trim()
, vilket är kostsamt brus för char(n)
(se nedan), eller felaktigt för andra teckentyper:strängar som endast består av mellanslag skulle passera som tom sträng.
coalesce(stringexpression, '') = ''
Men uttrycken överst är snabbare.
Att hävda motsatsen är ännu enklare:"stringexpression
är varken NULL eller tom" :
stringexpression <> ''
Om char(n)
Det här handlar om datatypen char(n)
, förkortning för:character(n)
. (char
/ character
är en förkortning för char(1)
/ character(1)
.) Dess användning avråds från Postgres:
I de flesta situationer
text
ellercharacter varying
bör användas istället.
Blanda inte ihop char(n)
med andra användbara teckentyper varchar(n)
, varchar
, text
eller "char"
(med dubbla citattecken).
I char(n)
en tom sträng skiljer sig inte från någon annan sträng som endast består av mellanslag. Alla dessa är vikta till n mellanslag i char(n)
per definition av typen. Det följer logiskt att ovanstående uttryck fungerar för char(n)
likaså - lika mycket som dessa (som inte skulle fungera för andra karaktärstyper):
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
Demo
Tom sträng är lika med vilken sträng som helst med mellanslag när den casts till 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
Testa för "null eller tom sträng" 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 | 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
Testa för "null eller tom sträng" 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 | 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<>spela här
Gammal sqlfiddle
Relaterat:
- Några nackdelar med att använda datatypen "text" för att lagra strängar?