DANS la Clause NULLE ou EST NULL
Postgres est la base de données
Puis-je utiliser une valeur NULL pour un DANS la clause? exemple:
SELECT *
FROM tbl_name
WHERE id_field IN ('value1', 'value2', 'value3', NULL)
Je veux limiter à ces quatre valeurs.
J'ai essayé la déclaration ci-dessus et ça ne fonctionne pas, eh bien, il s'exécute mais ne pas ajouter les enregistrements avec des valeurs NULL id_fields.
J'ai aussi essayé d'ajouter un OU un état, mais ce juste faire la requête à exécuter et exécuter avec aucune fin en vue.
SELECT *
FROM tbl_name
WHERE other_condition = bar
AND another_condition = foo
AND id_field IN ('value1', 'value2', 'value3')
OR id_field IS NULL
Des suggestions?
- Un
in
déclaration sera analysée de façon identique àfield=val1 or field=val2 or field=val3
. Mettre une valeur null dans il y aura bouillir jusqu'àfield=null
qui ne marchera pas. - la 2ème requête doit être droit. quelles sont les autres choses sont dans votre
where
clause? - A. Blanc, mis à jour pour refléter la requête avec plusieurs conditions
Vous devez vous connecter pour publier un commentaire.
(Commentaire par Marc B)
Je voudrais faire cela pour clairity
Votre requête échoue en raison de la priorité de l'opérateur.
AND
lie avantOR
!Vous avez besoin d'une paire de parenthèses, ce qui n'est pas une question de "clarté", mais par pure logique nécessité.
L'ajout de parenthèses empêcher
AND
de liaison avantOR
. Si il n'y avait pas d'autresWHERE
conditions (pas deAND
) vous ne serait pas besoin parenthèses. L'on a accepté la réponse est un peu trompeur à cet égard.De sorte que vous éliminez la valeur null à partir de la case. Étant donné une valeur null dans id_field, les fusionner en fonction de la place de null return 'unik_null_value", et en ajoutant 'unik_null_value à la liste, la requête retourne les postes où id_field est valeur1-3 ou null.
La question répondu par Daniel est perfctly amende. Je voulais laisser une note concernant les valeurs NULL. Nous devons être prudent sur l'utilisation de PAS DANS l'opérateur lorsqu'une colonne contient des valeurs NULL. Vous n'aurez pas de sortie si votre colonne contient des valeurs NULL et que vous êtes en utilisant le PAS DE l'opérateur. C'est la façon dont c'est expliqué ici http://www.oraclebin.com/2013/01/beware-of-nulls.html , un très bon article qui j'en suis venu à travers et de la pensée, de la partager.
Remarque: Depuis quelqu'un a prétendu que le lien externe est mort dans Sushant Butta de réponse que j'ai posté le contenu ici comme une réponse distincte.
Méfiez-vous des les valeurs NULL.
Aujourd'hui je suis tombé sur une très étrange comportement de requête lors d'une utilisation et
NOT IN
opérateurs. En fait, je voulais comparer les deux tables et de savoir si une valeur detable b
existé danstable a
ou pas et de trouver son comportement si la colonne contient desnull
valeurs. Donc, je viens de créer un environnement de test de ce comportement.Nous allons créer une table
table_a
.Nous allons créer une table
table_b
.Insérer des valeurs dans
table_a
.Insérer des valeurs dans
table_b
.Maintenant, nous allons exécuter une requête pour vérifier l'existence d'une valeur dans
table_a
par la vérification de la valeur detable_b
à l'aide deIN
opérateur.Exécuter la requête ci-dessous pour vérifier la non-existence.
La sortie est venu comme prévu. Maintenant, nous allons insérer un
null
valeur dans le tableautable_b
et de voir comment ces deux requêtes se comporter.La première requête est comporté comme prévu, mais ce qui s'est passé à la deuxième requête? Pourquoi n'avons-nous pas obtenir toute sortie, que doit-il arrivé? Quelle est la différence dans la requête? Pas.
Le changement dans les données de la table
table_b
. Nous avons introduit unnull
valeur dans la table. Mais comment se fait-il de se comporter comme cela? Nous allons diviser les deux requêtes en"AND"
et"OR"
opérateur.Première Requête:
La première requête sera traitée en interne, quelque chose comme ça. Ainsi, un
null
ne va pas créer un problème ici que mon premier deux opérandes seront soit évaluer àtrue
oufalse
. Mais mon troisième opérandea = null
sera ni évaluer àtrue
nifalse
. Elle permettra d'évaluer ànull
seulement.Deuxième Requête:
La deuxième requête sera traitée comme ci-dessous. Puisque nous sommes à l'aide d'un
"AND"
de l'opérateur et de rien d'autre quetrue
dans toute l'opérande ne me donne aucune sortie.Alors, comment gérons-nous cela? Nous allons prendre toutes les
not null
valeurs du tableautable_b
tout en utilisantNOT IN
opérateur.Il faut donc toujours être prudent sur
NULL
valeurs dans la colonne tout en utilisantNOT IN
opérateur.Méfiez-vous des NULS!!
Je sais que c'est tard pour répondre, mais il pourrait être utile pour quelqu'un d'autre
Vous pouvez utiliser des sous-requêtes et de convertir la valeur null à 0