sql >> Database >  >> RDS >> PostgreSQL

Beste manier om te controleren op lege of null-waarde

De uitdrukking stringexpression = '' opbrengsten:

TRUE .. voor '' (of voor elke tekenreeks die alleen uit spaties bestaat met het gegevenstype char(n) )
NULL .. voor NULL
FALSE .. voor iets anders

Dus om te controleren op:"stringexpression is NULL of leeg" :

(stringexpression = '') IS NOT FALSE

Of de omgekeerde benadering (misschien gemakkelijker te lezen):

(stringexpression <> '') IS NOT TRUE

Werkt voor elk tekentype inclusief char(n) . De handleiding over vergelijkingsoperatoren.

Of gebruik je originele uitdrukking zonder trim() , wat een kostbare ruis is voor char(n) (zie hieronder), of onjuist voor andere tekentypes:tekenreeksen die alleen uit spaties bestaan, gaan door als lege tekenreeks.

coalesce(stringexpression, '') = ''

Maar de uitdrukkingen bovenaan zijn sneller.

Het tegendeel beweren is nog eenvoudiger:"stringexpression is niet NULL of leeg" :

stringexpression <> ''

Over char(n)

Dit gaat over het gegevenstype char(n) , afkorting van:character(n) . (char / character zijn een afkorting voor char(1) / character(1) .) Het gebruik ervan wordt afgeraden in Postgres:

In de meeste situaties text of character varying moet in plaats daarvan worden gebruikt.

Verwar char(n) niet met andere, nuttige, tekentypes varchar(n) , varchar , text of "char" (met dubbele aanhalingstekens).

In char(n) een lege string verschilt niet van andere strings die alleen uit spaties bestaan. Deze zijn allemaal gevouwen tot n spaties in char(n) per definitie van het type. Het is logisch dat de bovenstaande uitdrukkingen werken voor char(n) ook - net zoveel als deze (wat niet zou werken voor andere karaktertypes):

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

Demo

Lege tekenreeks is gelijk aan elke reeks spaties wanneer gecast naar char(n) :

SELECT ''::char(5) = ''::char(5)     AS eq1
     , ''::char(5) = '  '::char(5)   AS eq2
     , ''::char(5) = '    '::char(5) AS eq3;

Resultaat:

 eq1 | eq2 | eq3
 ----+-----+----
 t   | t   | t

Test op "null of lege string" met 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);

Resultaat:

 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

Test op "null of lege string" met 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);

Resultaat:

 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<>viool hier
Oude sqlfiddle

Gerelateerd:

  • Enige nadelen van het gebruik van datatype "text" voor het opslaan van strings?


  1. MySQL Group_Concat() versus T-SQL String_Agg()

  2. Maak PostgreSQL-database on-the-fly met Hibernate, zelfs als de DB niet bestaat

  3. JDBC MySql-verbindingspoolingpraktijken om een ​​uitgeputte verbindingspool te voorkomen

  4. Foreach of For - dat is de vraag