cas lorsque la valeur null false
Aujourd'hui, j'ai été surpris par cette case
comportement:
select case when null then true else false end;
case
------
f
Je m'attends à ce qu'il revienne null
depuis un null
coulé à booléenne yelds un null
pas un false
:
select null::boolean is null;
?column?
----------
t
Tout commentaire sur les raisons de ce comportement? Ce qui me manque?
OriginalL'auteur Clodoaldo Neto | 2013-03-14
Vous devez vous connecter pour publier un commentaire.
Que vous pensez de la
CASE
expression comme si c'était de prendre lenull
comme entrée à une fonction ou de l'opérateur, où null entrée en résulte généralement null sortie:wheras en fait, il se comporte comme un
WHERE
clause en termes de gestion des valeurs null:Dans
WHERE
clauses - et dansCASE
, unNULL
le résultat d'un test d'expression est considérée comme "pas vrai et fausse". À certains égards, il est regrettable que la norme SQL n'a pas fait unNULL
résultat dans unWHERE
expression d'une erreur au lieu de les traiter comme faux, mais c'est comment il est.C'est encore un autre symptôme douloureux de
NULL
's dédoublement de la personnalité, où le SQL spec ne peut pas décider siNULL
signifie "inconnu/valeur non définie" ou "l'absence de valeur", à l'instar de l'horrible gâchis avecNULL
s et des agrégats.Oui, et c'est à peu près la politique où la spécification et la sane conflit mondial. Dans ce cas, je pense que c'est tout à fait raisonnable, bien;
CASE
n'est pas une fonction, c'est une expression particulière, avec ses règles propres. Fonctions spéciales la gestion des valeurs null de toute façon, le témoignage d'Oracledecode
. PostgreSQL ne peut pas résoudre ce sans avoir à réécrire le code SQL spec pour résoudre la confusion sur les valeurs null entièrement, dans le processus de décision, il est totalement incompatible avec tout le reste.OriginalL'auteur Craig Ringer
Utiliser quelque chose comme
OriginalL'auteur tsunllly
Dans le cas où vous (aussi) besoin de quelque chose comme
Utilisation:
Dans le cas où vous avez encore besoin d'un exposé puis d'utiliser:
OriginalL'auteur Thorsten Niehues
Vous pouvez utiliser 'select' pour vérifier les DONNÉES de la colonne null:
OriginalL'auteur Grigory K
La
CASE
déclaration que vous avez écrit a deux branches:L'un,
when null then true
, n'arrivera jamais (parce quenull
n'est pas égal àtrue
)Et
else
branche, qui va se passer quand il n'y a pas des matchs régulierswhen
branches.Exemple:
val
est nul on ne peut pas dire si il y a ou il n'y a pas un match depuisnull = 1
résultats null pas faux, ni vrai.entre dans la première branche où la condition est évaluée à
TRUE
. Si aucune branche estTRUE
,ELSE
victoires, dont la valeur par défautNULL
s'il est manquant. Que toute l'histoire.OriginalL'auteur Igor Romanchenko
Comme le Documentation PostgreSQL états:
Postgresql ne jette la sortie, et puisque vous avez un
else
état, vous vous êtesfalse
. La requête suivante renvoie une valeur nulle (Car il n'y a pas deelse
condition)null
vous ne pouvez pas dire qu'il n'est pas vrai. Vous ne connaissez pas. Il pourrait y avoir de vrai ou de faux.Est "null = true" vrai? Non, c'est nul. Cela signifie que la première branche est rejeté et l'autre prend place. Tests conditionnels dans SQL ne sont pas de type boolean. Par conséquent, toutes les cerveau-douleurs causées par des valeurs null.
OriginalL'auteur EmCo