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)
您可以使用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.