Quelle est la meilleure façon d'assimiler les colonnes NULL en SQL?

MERGE un MERGE entre deux tables

 MERGE indexdecomp.Constituent targ USING (SELECT ic.ConstituentName FROM indexdecomp.IndexConstituents ic) src ON (((targ.Name = src.ConstituentName) OR (targ.Name IS NULL AND src.ConstituentName IS NULL))) WHEN NOT MATCHED BY TARGET THEN UPDATE SET targ.Name = src.ConstituentName ; 

et dans ma clause ON j'ai le prédicat suivant:

 (targ.Name = src.ConstituentName) OR (targ.Name IS NULL AND src.ConstituentName IS NULL) 

J'ai ce prédicat puisque je le considère un match si les deux noms sont égaux ou si les deux noms sont `null.

Existe-t-il une manière meilleure ou plus conventionnelle de gérer l'égalité entre deux colonnes null ? De quelle façon produirait l'exécution la plus rapide?

Vous pouvez faire quelque chose comme ceci: ( SQL ref )

 SET ANSI_NULLS OFF; MERGE indexdecomp.Constituent targ USING (SELECT ic.ConstituentName FROM #IndexConstituents ic) src ON (((targ.Name = src.ConstituentName))) WHEN NOT MATCHED BY TARGET THEN UPDATE SET targ.Name = src.ConstituentName; SET ANSI_NULLS ON; 

Mais cela semble être un compromis assez lourd pour s'emparer d'un prédicat et ni l'un ni l'autre n'est très lisible. Vous pourriez réellement résumer ce désordre avec un UDF qui prend deux arguments de string et renvoie un boolean.

Quelque chose comme:

 create function StrNullCompare(@a varchar(max), @b varchar(max)) returns int as begin if ((@a = @b) or (@a is null and @b is null)) return 1; return 0; end -- tests select dbo.StrNullCompare('wer', 'were'); select dbo.StrNullCompare('wer', 'wer'); select dbo.StrNullCompare('hi', null); select dbo.StrNullCompare(null, null); 

Et votre prédicat devient:

 (dbo.StrNullCompare(targ.Name, src.ConstituentName)=1) 

Tu pourrais essayer..

 ISNULL (targ. Name,'a magic ssortingng value') =ISNULL (src.ConstituentName,'a magic ssortingng value') 

Bien sûr, ajoutez votre propre string magique, par exemple, utilisez newid () pour get un guid et utilisez-le.

Pas vraiment sûr si c'est "mieux" qu'un an et ou mais est un peu plus lisible par l'homme; Cela vaut la peine d'effectuer des parsings comparatives et de tester les deux approches.