NULLIF()有哪些应用程序?

时间:2011-06-02 22:08:48

标签: sql

我只是对NULLIF()进行了一次微不足道但真正的使用,这是我职业生涯第一次使用SQL。它是一个我忽略的广泛使用的工具,还是几乎被遗忘的SQL怪癖?它出现在所有主要的数据库实现中。

如果有人需要复习,NULLIF(A, B)会返回第一个值,除非它等于第二个值,在这种情况下它会返回NULL。它等同于CASE语句:

CASE WHEN A <> B OR B IS NULL THEN A END

或者,用C风格的语法:

A == B || A == null ? null : A

到目前为止,我发现的唯一一个非常重要的例子是从聚合函数中排除特定值:

SELECT COUNT(NULLIF(Comment, 'Downvoted'))

这具有仅允许一个跳过单个值的限制;一个CASE,虽然更详细,但会让你使用表达式。

对于记录,我发现的用途是抑制“最近更改”列的值,如果它等于第一个更改:

SELECT Record, FirstChange, NULLIF(LatestChange, FirstChange) AS LatestChange

这只是因为它减少了人类消费者的视觉混乱。

5 个答案:

答案 0 :(得分:5)

我宁愿认为

NULLIF(A, B)

的语法糖
CASE WHEN A = B THEN NULL ELSE A END

但你是对的:它只是帮助人类读者的语法糖。

答案 1 :(得分:3)

我经常在需要避免除零除外的地方使用它:

SELECT
  COALESCE(Expression1 / NULLIF(Expression2, 0), 0) AS Result
FROM …

答案 2 :(得分:2)

三年后,我发现了NULLIF的一个实质用途:使用NULLIF(Field, '')将空字符串转换为NULL,与Oracle关于“NULL”代表什么的特殊想法等效。

答案 3 :(得分:0)

当您处理包含空值和空字符串混合的旧数据时,

NULLIF非常方便。

例:
SELECT(COALESCE(NULLIF(firstColumn, ''), secondColumn) FROM table WHERE this = that

答案 4 :(得分:0)

SUMCOUNT具有将空值转换为零的行为。当你想撤消这种行为时,我可以看到NULLIF很方便。如果事实是我提供的recent answer。如果我记得NULLIF,我可能会编写以下内容

SELECT student, 
       NULLIF(coursecount,0) as courseCount 
FROM   (SELECT cs.student, 
               COUNT(os.course) coursecount 
        FROM   @CURRENTSCHOOL cs 
               LEFT JOIN @OTHERSCHOOLS os 
                 ON cs.student = os.student 
                    AND cs.school <> os.school 
        GROUP  BY cs.student) t