Comment comparer les valeurs qui peuvent être null est T-SQL
Je veux m'assurer que je ne suis pas d'insérer une ligne en double dans ma table (par exemple, seule clé primaire différentes). Tout mon champ autoriser les valeurs NULL que j'ai décidé de la valeur null signifie "toutes les valeurs". En raison de la valeur null, la déclaration suivante dans ma procédure stockée ne peut pas fonctionner:
IF EXISTS(SELECT * FROM MY_TABLE WHERE
MY_FIELD1 = @IN_MY_FIELD1 AND
MY_FIELD2 = @IN_MY_FIELD2 AND
MY_FIELD3 = @IN_MY_FIELD3 AND
MY_FIELD4 = @IN_MY_FIELD4 AND
MY_FIELD5 = @IN_MY_FIELD5 AND
MY_FIELD6 = @IN_MY_FIELD6)
BEGIN
goto on_duplicate
END
depuis NULL = NULL n'est pas vrai.
Comment puis-je vérifier les doublons sans avoir de SI EST NUL, pour chaque colonne?
- Sont à la fois
MY_FIELD{1,6}
(de la table) et les variables@IN_MY_FILED{1,6}
nullable ou est-ce justeMY_FIELD{1,6}
?
Vous devez vous connecter pour publier un commentaire.
Utilisation
INTERSECT
opérateur.C'est
NULL
-sensible et efficace si vous avez un indice composite sur tous vos champs:Notez que si vous créez un
UNIQUE
index sur les champs, votre vie sera beaucoup plus simple.Dans le même sens que @Eric réponse, mais sans l'aide d'un
'NULL'
symbole.Ce n'est vrai que si les deux valeurs sont
non-NULL
, et l'égalité de l'autre, ou les deux valeurs sontNULL
A = B OR ISNULL(A, B) IS NULL
sans l'inutile parens), mais il n'est pas sûr d'inverser en raison de la façon INCONNUE ne parvient pas à inverser. Le plus court de l'Inégalité de test que j'ai vu est @WileCau de l'.J'avais besoin d'une comparaison similaire lors d'une FUSION:
Les vérifications supplémentaires sont à éviter de mettre à jour les lignes où toutes les colonnes sont déjà les mêmes. Pour mes fins, je voulais
NULL <> anyValue
pour être Vrai, etNULL <> NULL
être Faux.La solution évolué comme suit:
Première tentative:
Deuxième tentative:
Troisième tentative (inspiré par @Alors la réponse de):
La même ISNULL/NULLIF logique peut être utilisée pour tester l'égalité et de l'inégalité:
ISNULL(NULLIF(A, B), NULLIF(B, A)) IS NULL
ISNULL(NULLIF(A, B), NULLIF(B, A)) IS NOT NULL
Voici un SQL-Violon en montrant comment il fonctionne http://sqlfiddle.com/#!3/471d60/1
NULLIF(A, B) IS NULL AND NULLIF(B, A) IS NULL
(pour l'Égalité) et non PAS avec la pagaille avec les parens de l'inégalité. Le vôtre est de 3 caractères plus court de l'Égalité et de 4 caractères plus court pour l'Inégalité, mais je pense que le mien est un peu plus facile à comprendre (même si c'est certainement par rapport à ce cas).Utilisation
ISNULL
:Vous pouvez modifier
'NULL'
à quelque chose comme'All Values'
si il est plus logique de le faire.Il convient de noter que, avec deux arguments,
ISNULL
fonctionne de la même commeFUSIONNER
, que vous pouvez utiliser si vous avez un peu de valeurs à tester (c'est à dire-COALESCE(@IN_MY_FIELD1, @OtherVal, 'NULL')
).COALESCE
également de retour après le premier non-nulle, ce qui signifie qu'il est (un peu) plus vite si vous vous attendez à MY_FIELD1 être vide. Cependant, je trouveISNULL
beaucoup plus lisible, c'est pourquoi je l'ai utilisé, ici.Verbeux par rapport à la IFNULL/FUSIONNER solution. Mais les travaux sans avoir à penser à ce que la valeur n'apparaîtra pas dans les données qui peuvent être utilisés comme le stand de la valeur NULL.
Vous pourrait fusionner chaque valeur, mais c'est un peu grincer des dents induisant:
Vous auriez également besoin de s'assurer que le
coalesced
valeur n'est pas une valeur valide sur la colonne en question. Par exemple, si il était possible que la valeur de MY_FIELD1 pourrait être "MF1", puis ce serait la cause de beaucoup de fausses hits.Que si vous voulez faire une comparaison pour les valeurs qui ne SONT PAS égaux? Juste à l'aide d'un "NON" en face de, déjà mentionnés, les comparaisons ne fonctionne pas. Le meilleur que j'ai pu arriver, c'est:
Vous créer une clé primaire sur vos champs et de laisser le moteur d'assurer l'unicité. SI il EXISTE logique est incorrecte de toute façon comme c'est imparfait, avec des conditions de course.
Est égal à comparaison:
Pas Égal À comparaison: il suffit de nier la est Égal à comparaison ci-dessus.
Est-il détaillé? Oui, il est. Cependant, il est efficace car il n'a pas d'appeler n'importe quelle fonction. L'idée est d'utiliser de court-circuit dans les prédicats assurez-vous que l'opérateur égal (=) est utilisé uniquement avec les valeurs non null, null sinon se serait propagée vers le haut dans l'arborescence d'expression.
Vous pouvez utiliser
SET ANSI_NULLS
afin de préciser le comportement du signe Égal (=) et n'est Pas Égal À (<>) les opérateurs de comparaison lorsqu'ils sont utilisés avec des valeurs null.Vous devrez utiliser la valeur EST NULLE ou ISNULL. Il n'est pas vraiment loin autour d'elle.
NULLIF(LA CIBLE.relation_id, SOURCE.app_relation_id) EST NULLE solution Simple
Avez-vous vérifier NULLIF?
http://msdn.microsoft.com/en-us/library/ms177562.aspx