2010-01-14 11 views
0

Aujourd'hui, je trouve un problème étrange est que j'ai une table avec une colonne Nullable et j'ai essayé d'utiliser la requête suivanteMyNullableCol <> « MyValue » ne comprend pas les lignes où MyNullableCol IS NULL

SELECT * Id, MyNCol, dE dbo. [MyTable] OÙ MyNCol <> 'MyValue'

Et pour revenir attendant valeur toutes les lignes n'ayant pas 'MyValue' dans le champ MyNCol. Mais ce n'est pas retournant toutes ces lignes contenant NULL dans la colonne ci-dessus spécifié (MyNCol). donc je dois Réécrire ma requête à

SELECT * Id, MyNCol, DE dbo. [MyTable] OÙ MyNCol <> 'MyValue' OU MyNCol IS NULL

Now My question est pourquoi est-ce pourquoi la première requête n'est pas suffisante pour effectuer ce que je désire. :(

Cordialement Mubashar

Répondre

1

Regardez dans le comportement de « ANSI NULLs "

Normalement, NULL! = NULL Vous pouvez modifier ce comportement en modifiant la propriété ANSI NULLS de votre base de données, mais cela a des effets étendus sur le stockage des colonnes et l'exécution des requêtes. Instruction ANSI_NULLS dans votre script SQL:

MSDN Documentation pour SQL Server 2008 est ici:
SET ANSI_NULLS (Transact-SQL)

accorder une attention particulière aux détails de la façon dont les comparaisons sont effectuées - même lors de la mise ANSI_NULLS OFF, colonne pour les comparaisons de colonnes ne peuvent pas se comporter comme vous le souhaitez. Il est recommandé de toujours utiliser IS NULL et IS NOT NULL.

0

opérateurs l'égalité ne peuvent pas être effectuées sur des valeurs nulles. Cependant, en 2005 cela a changé dans SQL 2000, vous pouvez vérifier null = null,.

0

NULL = INCONNU. Donc, vous ne pouvez pas dire que MyNCol = 'Ma valeur' ​​ni que MyNCol <> 'Ma valeur' ​​- tous les deux évaluent à INCONNU (tout comme 'foo' + MyNCol deviendra NULL). Une alternative à la solution de contournement que vous avez envoyé:

WHERE COALESCE(MyNCol, 'Not my Value') <> 'My Value'; 

Cela inclut les colonnes NULL parce que la comparaison devient fausse plutôt que inconnue. Je n'aime pas mieux cette option car elle repose sur une valeur magique dans la comparaison, même si cette valeur magique ne sera fournie que lorsque la colonne est NULL.

+0

Merci pour la réponse, Oui vous avez raison je ne pensais pas de cette façon. mais qu'est-ce que vous pensez que ma deuxième requête est meilleure ou la façon dont vous dites ?. –

+0

Est-ce que l'un ou l'autre sens a plus de sens pour vous ou pour votre équipe? –