SQL检查为零或null

时间:2014-10-06 17:51:06

标签: tsql conditional-statements

嗨我有一些问题

如果做某些算法的错误

,需要按列检查为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

4 个答案:

答案 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