Pasando por NULL

Mucha gente conoce y usa la funci贸n incorporada ISNULL (X, Y), que reemplaza el primer argumento con el segundo si es (first) NULL. Menos utilizada es la funci贸n inversa incorporada NULLIF (X, Y), que devuelve NULL si el primer argumento es igual al segundo. La combinaci贸n de estas dos funciones evita el uso de construcciones IF-ELSE o CASE-WHEN, lo que hace que el c贸digo sea m谩s compacto. Si est谩 interesado en ver un par de ejemplos, bienvenido a cat.

Por ejemplo, aqu铆 hay un c贸digo que genera 10 enteros aleatorios en el rango de 1 a 37, y el valor m谩s cercano igual o mayor que el n煤mero mostrado es un m煤ltiplo 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 

Puede deshacerse de CASE ... CUANDO realice el siguiente truco: convertir NULL en el resultado de la expresi贸n Q.Src% 6 si el resto es 0, sabiendo que el resultado de cualquier operaci贸n con NULL es NULL y luego restaurar NULL a 0 con una funci贸n externa 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 

Otro ejemplo es dividir una cadena en dos partes por un espacio (por ejemplo, un nombre de una cadena Nombre <espacio> Apellido. Un problema t铆pico aqu铆 cuando se resuelve "de frente" es la funci贸n IZQUIERDA al pasar un argumento de -1 como el valor del n煤mero de caracteres que se cortar谩 en caso de que cuando no hay espacio en la l铆nea de origen (CHARINDEX devuelve 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 convierte 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 

隆Disfruta de la programaci贸n SQL!

Source: https://habr.com/ru/post/es413747/


All Articles