Beaucoup de gens connaissent et utilisent la fonction intégrée ISNULL (X, Y), qui remplace le premier argument par le second s'il est (premier) NULL. La fonction intégrée inverse NULLIF (X, Y), qui renvoie NULL si le premier argument est égal au second, est moins utilisée. La combinaison de ces deux fonctions évite l'utilisation des constructions IF-ELSE ou CASE-WHEN, ce qui rend le code plus compact. Si vous êtes intéressé à voir quelques exemples, bienvenue à cat.
Par exemple, voici un code qui génère 10 entiers aléatoires dans la plage de 1 à 37, et la valeur la plus proche égale ou supérieure au nombre affiché est un multiple de 6.
SELECT Q.Src, CASE WHEN Q.Src % 6 = 0 THEN Q.Src ELSE Q.Src + (6 - Q.Src % 6) END AS NextTimes6 FROM ( SELECT TOP 10 CONVERT(INT, 1 + 37 * RAND(CHECKSUM(NEWID()))) Src FROM SYSOBJECTS S ) Q
Vous pouvez vous débarrasser de CASE..WHEN en effectuant l'astuce suivante - transformer NULL le résultat de Q.Src% 6 si le reste est 0, sachant que le résultat de toute opération avec NULL est NULL, puis restaurer NULL à 0 avec une fonction externe ISNULL:
SELECT Q.Src, Q.Src + ISNULL(6 - NULLIF(Q.Src % 6, 0), 0) AS NextTimes6 FROM ( SELECT TOP 10 CONVERT(INT, 1 + 37 * RAND(CHECKSUM(NEWID()))) Src FROM SYSOBJECTS S ) Q
Un autre exemple consiste à diviser une chaîne en deux parties par un espace (par exemple, un nom à partir d'une chaîne Nom <espace> Nom de famille. Un problème typique ici lors de la résolution "frontale" est la fonction LEFT qui se bloque lors du passage d'un argument de -1 comme valeur du nombre de caractères à couper au cas où lorsqu'il n'y a pas d'espace dans la ligne source (CHARINDEX renvoie 0):
SELECT Q.Src, CASE WHEN CHARINDEX(' ', Q.Src) > 0 THEN LEFT(Q.Src, CHARINDEX(' ', Q.Src) - 1) ELSE Q.Src END AS NameOnly FROM ( SELECT N' ' AS Src UNION ALL SELECT N'' ) Q
Se transforme en:
SELECT Q.Src, LEFT(Q.Src, ISNULL(NULLIF(CHARINDEX(' ', Q.Src), 0) - 1, LEN(Q.Src))) AS NameOnly FROM ( SELECT N' ' AS Src UNION ALL SELECT N'' ) Q
Profitez de la programmation SQL!