sql >> Databáze >  >> RDS >> PostgreSQL

Nejlepší způsob, jak zkontrolovat prázdnou nebo nulovou hodnotu

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 nebo character 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ů?


  1. Použití proměnné periody v intervalu v Postgresu

  2. MariaDB JSON_DEPTH() Vysvětleno

  3. Přidejte jedinečné omezení ke kombinaci dvou sloupců

  4. SQL Server *=Operátor?