sql >> Databasteknik >  >> RDS >> PostgreSQL

Bästa sättet att kontrollera om det finns tomt eller nullvärde

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 eller character 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?


  1. MySQL LOG2() Funktion – Returnerar bas-2-logaritmen för ett värde

  2. ZDLRA – RMAN-20035 ogiltig hög RECID

  3. Gå och IN-klausul i Postgres

  4. MariaDB JSON_REPLACE() Förklarad