通过NULL

许多人都知道并使用内置函数ISNULL(X,Y),如果第一个参数为(第一个)NULL,它将用第二个参数替换第一个参数。 较不常用的是内置的逆函数NULLIF(X,Y),如果第一个参数等于第二个参数,则返回NULL。 这两个函数的组合避免了使用IF-ELSE或CASE-WHEN构造,这使代码更加紧凑。 如果您有兴趣看几个示例,欢迎来到cat。

例如,以下代码输出10个随机整数,范围为1到37,并且等于或大于显示的数字的最接近值是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 

您可以通过以下技巧来摆脱CASE..WHEN:-如果余数为0,则将Q.Src%6的结果变为NULL,知道任何使用NULL的运算结果为NULL,然后使用外部函数将NULL恢复为0 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 

另一个示例是用空格将字符串分为两部分(例如,字符串名称<space>姓氏中的名称。解决“ head on”问题时的典型问题是LEFT函数在传递参数-1作为要剪切的字符数的值时崩溃当源行中没有空格(CHARINDEX返回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 

变成:

 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 

享受SQL编程!

Source: https://habr.com/ru/post/zh-CN413747/


All Articles