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?