sql >> Database teknologi >  >> RDS >> PostgreSQL

Bedste måde at tjekke for tom eller null værdi

Udtrykket stringexpression = '' giver:

TRUE .. for '' (eller for hvilken som helst streng, der kun består af mellemrum med datatypen char(n) )
NULL .. for NULL
FALSE .. til noget andet

Så for at tjekke efter:"stringexpression er enten NULL eller tom" :

(stringexpression = '') IS NOT FALSE
 

Eller den omvendte tilgang (kan være lettere at læse):

(stringexpression <> '') IS NOT TRUE
 

Virker for enhver tegntype inklusive char(n) . Manualen om sammenligningsoperatører.

Eller brug dit originale udtryk uden trim() , hvilket er dyr støj for char(n) (se nedenfor), eller forkert for andre tegntyper:strenge, der kun består af mellemrum, passerer som tom streng.

coalesce(stringexpression, '') = ''
 

Men udtrykkene i toppen er hurtigere.

At hævde det modsatte er endnu nemmere:"stringexpression er hverken NULL eller tom" :

stringexpression <> ''
 

Om char(n)

Det handler om datatypen char(n) , forkortelse for:character(n) . (char / character er en forkortelse for char(1) / character(1) .) Dens brug frarådes i Postgres:

I de fleste situationer text eller character varying skal bruges i stedet.

Forveksle ikke char(n) med andre nyttige tegntyper varchar(n) , varchar , text eller "char" (med dobbelte anførselstegn).

I char(n) en tom streng er ikke forskellig fra enhver anden streng, der kun består af mellemrum. Alle disse er foldet til n mellemrum i char(n) efter definition af typen. Det følger logisk, at ovenstående udtryk virker for char(n) også - lige så meget som disse (som ikke ville fungere for andre karaktertyper):

coalesce(stringexpression, '  ') = '  '
coalesce(stringexpression, '') = '       '
 

Demo

Tom streng svarer til enhver streng af mellemrum, når den castes til 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

Test for "nul eller tom streng" 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 | samles1 | samles2 | samles3 ------------------+------------+-------+-------+-- ------------------+----------- 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

Test for "nul eller tom streng" 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 | samles1 | samles2 | samles3 ------------------+------------+-------+-------+-- ------------------+----------- 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<>spil her
Gamle sqlfiddle

Relateret:

  • Er der nogen ulemper ved at bruge datatypen "tekst" til at gemme strenge?


  1. Microsoft Access vs SQL Server

  2. Kan ikke slette databasen

  3. Sådan logger du forespørgsler i PostgreSQL

  4. MySQL – Vent i sekunder med SELECT SLEEP()