嗨我有一些问题
如果做某些算法的错误
,需要按列检查为null或零这是一张表:
col1 col2 col3 col4
1 0 3376 0
2 600 null 14468.5714
3 null 0 0
4 600 3376 null
COALESCE
无法使用零" 0"价值,case
太大了
需要实现其中一些
, CAST(COALESCE(col2, (col3/7), (col4/30)) as money) col2
, CAST(COALESCE(col3, (col2*7), (col4/30*7))as money) col3
, CAST(COALESCE(col4, (col3/7*30),(col2*30))as money) col4
如何以最快的方式解决这个问题。 THANX
答案 0 :(得分:3)
虽然COALESCE允许您使用特定值替换NULL,但NULLIF将允许您使用NULL替换特定值。你可以在0上使用后者,最后得到这样的东西:
, CAST(
COALESCE(
NULLIF(col2, 0),
NULLIF(col3, 0) / 7,
NULLIF(col4, 0) / 30
) AS money
) AS col2
, CAST(
COALESCE(
NULLIF(col3, 0),
NULLIF(col2, 0) * 7,
NULLIF(col4, 0) / 30 * 7)
) AS money
) AS col3
, CAST(
COALESCE(
NULLIF(col4, 0),
NULLIF(col3, 0) / 7 * 30,
NULLIF(col2, 0) * 30
) AS money
) AS col4
还是相当长的,如果你问我,但肯定比使用CASE短。每个表达式中的最后一个NULLIF可能是不必要的,我将它们留在那里以保持一致性。也许你可以在任何地方添加0
的第四个参数,只是为了确保结果永远不是NULL。
答案 1 :(得分:2)
为什么不使用像
这样的CASE
条件
CASE WHEN col2 is not null and col2 <> 0 THEN your_calculation
答案 2 :(得分:1)
您可以使用CASE语句执行子查询以检查零并返回NULL。 然后可以在子查询上运行当前查询。
我发现使用案例会很难看,因为你在COALESCE中有3个表达式
SELECT
CAST(COALESCE(col2 , (col3/7), (col4/30)) as money) col2
, CAST(COALESCE(col3, (col2*7), (col4/30*7))as money) col3
, CAST(COALESCE(col4, (col3/7*30),(col2*30))as money) col4
from
( SELECT case when col2 =0 then NULL else col2 end as col2,
case when col3 =0 then NULL else col3 end as col3,
case when col4 =0 then NULL else col4 end as col4
from Table1) T
答案 3 :(得分:0)
您可以使用NULLIF功能:
,CAST(COALESCE(NULLIF(col2,0), NULLIF(col3/7,0), NULLIF(col4/30,0)) as money) col2
,CAST(COALESCE(NULLIF(col3,0), NULLIF(col2*7,0), NULLIF(col4/30*7,0))as money) col3
,CAST(COALESCE(NULLIF(col4,0), NULLIF(col3/7*30,0),NULLIF(col2*30,0))as money) col4