Passando por NULL

Muitas pessoas conhecem e usam a função interna ISNULL (X, Y), que substitui o primeiro argumento pelo segundo, se for (primeiro) NULL. Menos comumente usada é a função interna inversa NULLIF (X, Y), que retorna NULL se o primeiro argumento for igual ao segundo. A combinação dessas duas funções evita o uso das construções IF-ELSE ou CASE-WHEN, o que torna o código mais compacto. Se você estiver interessado em ver alguns exemplos, seja bem-vindo ao gato.

Por exemplo, aqui está um código que gera 10 números inteiros aleatórios no intervalo de 1 a 37, e o valor mais próximo igual ou superior ao número exibido é um 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 

Você pode se livrar de CASE..WHEN executando o seguinte truque - transformando NULL o resultado de Q.Src% 6 se o restante for 0, sabendo que o resultado de qualquer operação com NULL é NULL e, em seguida, restaurando NULL de volta para 0 com uma função 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 

Outro exemplo é dividir uma string em duas partes por um espaço (por exemplo, um nome de uma string Name <space> Sobrenome. Um problema típico aqui ao resolver "de frente" é a função LEFT travar ao transmitir um argumento de -1 como valor do número de caracteres a serem cortados, caso quando não houver espaço na linha de origem (CHARINDEX retorna 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 transforma em:

 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 

Aproveite a programação SQL!

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


All Articles