检查列值是否为零 MS SQL Server

rya*_*sin 5 sql t-sql sql-server

我有一个视图,它有一个复杂的 CASE 语句来确定其中一列的值。

SELECT a.itemcode, count(*) total, b.foo
    CASE 
    WHEN foo IN ('aab', 'aac')
    THEN 1
    WHEN foo IN ('qqq', 'fff')
    THEN 2
    WHEN foo IN ('foo', 'bar')
    THEN 10 % count(*)
    ELSE 9 % count(*)
    END AS other_total

FROM a INNER JOIN b ON a.itemcode = b.itemcode
GROUP BY itemcode, foo
Run Code Online (Sandbox Code Playgroud)

我想添加一个检查 other_total 列的值。如果是0,我想将该值设置为1.

显然我可以用一个CASE声明来概括整个事情......

CASE ( CASE 
    WHEN foo IN ('aab', 'aac')
    THEN 1
    WHEN foo IN ('qqq', 'fff')
    THEN 2
    WHEN foo IN ('foo', 'bar')
    THEN 10 % count(*)
    ELSE 9 % count(*)
    END )
WHEN 0 THEN 1
ELSE  CASE 
    WHEN foo IN ('aab', 'aac')
    THEN 1
    WHEN foo IN ('qqq', 'fff')
    THEN 2
    WHEN foo IN ('foo', 'bar')
    THEN 10 % count(*)
    ELSE 9 % count(*)
    END
END AS other_total
Run Code Online (Sandbox Code Playgroud)

但这只是有点乱,似乎应该有更简单的方法。

是否有另一个类似于 的函数,ISNULL()如果它等于 0,它允许我更改列的值?

回答

感谢 gofr1 的回答,我能够解决这个问题。如果 case 语句等于 0,我使用 NULLIF 函数返回 NULL,然后如果 NULLIF 函数返回 NULL,则用 ISNULL 函数将值设置为 1。

SELECT a.itemcode, count(*) total, b.foo,
    ISNULL (
        NULLIF (
            CASE 
            WHEN foo IN ('aab', 'aac')
            THEN 1
            WHEN foo IN ('qqq', 'fff')
            THEN 2
            WHEN foo IN ('foo', 'bar')
            THEN 10 % count(*)
            ELSE 9 % count(*)
            END 
        ), 0)
    ), 1) other_total

FROM a INNER JOIN b ON a.itemcode = b.itemcode
GROUP BY itemcode, foo
Run Code Online (Sandbox Code Playgroud)

gof*_*fr1 5

您可以使用NULLIF

如果两个指定的表达式相等,则返回空值。

CASE WHEN 
NULLIF(
    CASE WHEN foo IN ('aab', 'aac') THEN 1
        WHEN foo IN ('qqq', 'fff') THEN 2
        WHEN foo IN ('foo', 'bar') THEN 10 % count(*)
        ELSE 9 % count(*)
        END
    ,0) IS NULL THEN 0 ELSE 1 END
 AS other_total
Run Code Online (Sandbox Code Playgroud)

如果值= 0则变为NULL其他值在输出中。然后我们使用CASE WHEN value IS NULL then 0 else 1.