Der Ausdruck stringexpression = ''
ergibt:
TRUE
.. für ''
(oder für beliebige Zeichenfolge, die nur aus Leerzeichen besteht, mit dem Datentyp char(n)
)NULL
.. für NULL
FALSE
.. für alles andere
Also zu prüfen auf:"stringexpression
ist entweder NULL oder leer" :
(stringexpression = '') IS NOT FALSE
Oder der umgekehrte Ansatz (möglicherweise einfacher zu lesen):
(stringexpression <> '') IS NOT TRUE
Funktioniert für jeden Zeichentyp einschließlich char(n)
. Das Handbuch über Vergleichsoperatoren.
Oder Verwenden Sie Ihren ursprünglichen Ausdruck ohne trim()
, was kostspieliges Rauschen für char(n)
ist (siehe unten) oder falsch für andere Zeichentypen:Zeichenfolgen, die nur aus Leerzeichen bestehen, würden als leere Zeichenfolge übergeben.
coalesce(stringexpression, '') = ''
Aber die Ausdrücke ganz oben sind schneller.
Noch einfacher ist es, das Gegenteil zu behaupten:"stringexpression
ist weder NULL noch leer" :
stringexpression <> ''
Über char(n)
Hier geht es um den Datentyp char(n)
, kurz für:character(n)
. (char
/ character
stehen kurz für char(1)
/ character(1)
.) Von seiner Verwendung in Postgres wird abgeraten:
In den meisten Situationen text
oder character varying
sollte stattdessen verwendet werden.
Verwechseln Sie char(n)
nicht mit anderen, nützlichen Zeichentypen varchar(n)
, varchar
, text
oder "char"
(mit doppelten Anführungszeichen).
In character(n)
eine leere Zeichenkette unterscheidet sich nicht von anderen Zeichenfolgen, die nur aus Leerzeichen bestehen. All dies wird zu n gefaltet Leerzeichen in char(n)
pro Definition des Typs. Daraus folgt logischerweise, dass die obigen Ausdrücke für char(n)
funktionieren ebenso - genauso viel wie diese (die für andere Charaktertypen nicht funktionieren würden):
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
Demo
Eine leere Zeichenfolge ist gleich einer beliebigen Zeichenfolge aus Leerzeichen, wenn sie in char(n)
umgewandelt wird :
SELECT ''::char(5) = ''::char(5) AS eq1
, ''::char(5) = ' '::char(5) AS eq2
, ''::char(5) = ' '::char(5) AS eq3;
Ergebnis:
eq1 | eq2 | eq3
----+-----+----
t | t | t
Testen Sie mit char(n)
auf "null oder leere Zeichenfolge". :
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);
Ergebnis:
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
Testen Sie mit text
auf "null oder leere Zeichenfolge". :
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);
Ergebnis:
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<>hier fummeln
Altes sqlfiddle
Verwandte:
- Irgendwelche Nachteile bei der Verwendung des Datentyps „Text“ zum Speichern von Strings?