PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Der beste Weg, um nach leeren oder Nullwerten zu suchen

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?