Sql 嵌入在NVL中的Case语句

Sql 嵌入在NVL中的Case语句,sql,oracle,Sql,Oracle,我试图将下面的逻辑设置为除数。我需要使用NVL()来避免被零除的错误。我需要得到一个案件陈述的清晰计数 以下是我所拥有的: (NVL(COUNT(DISTINCT CASE WHEN ({field1} = 'a' OR {field1} = 'b' OR {field1} = 'c' OR {field1} = 'd') AND ({field2} = 'a' OR {field

我试图将下面的逻辑设置为除数。我需要使用NVL()来避免被零除的错误。我需要得到一个案件陈述的清晰计数

以下是我所拥有的:

(NVL(COUNT(DISTINCT 
           CASE WHEN ({field1} = 'a' OR {field1} = 'b' OR 
                      {field1} = 'c' OR {field1} = 'd') AND 
                      ({field2} = 'a' OR {field2} = 'b') AND 
                      ({field3} > TO_DATE('01-JAN-2017', 'DD-MON-YYYY'))
                THEN 1 END), 1))
我的语法有点问题,但无法解决


任何帮助都将不胜感激。谢谢大家!

我在

COUNT(DISTINCT
  CASE
    WHEN  field1 IN ('a','b','c','d')
      AND field2 IN ('a','b')
      AND field3  > TO_DATE('01-JAN-2017', 'DD-MON-YYYY')
    THEN 1
END)
COUNT(DISTINCT…
不返回null,因此删除了冗余的
NVL

现在,上面的结果将是0或1

您可能不希望有明显的:

COUNT(
  CASE
    WHEN  field1 IN ('a','b','c','d')
      AND field2 IN ('a','b')
      AND field3  > TO_DATE('01-JAN-2017', 'DD-MON-YYYY')
    THEN 1
END)
因为它是一个除数,它不能是0,所以你必须为它设置保护。除数为0时的一个合理输出为空。实现这一目标的一个方法是:

case when (expression) <> 0  then dividend/(expression) end
当(表达式)0然后被除数/(表达式)结束时的情况

代码非常清晰,我更改了标签。你应该解释你想做什么,因为代码看起来不正确。例如,您是否知道
count(distinct)
从不返回
NULL
?如果您对值1进行distinct count而不使用else,则“distinct counted”(distinct)的1将始终为1或0(如果没有值为1)。NVL不会将0更改为1。但是如果你想让0为1,那么它总是返回1。因此,为了简化,只需将
1
。。。是 啊你在追求什么?我应该在我的帖子中澄清我对SQL非常陌生,所以我不知道这是Oracle,所以感谢你更改了标签。我要做的是使用case语句对列中的不同值进行计数。然后我想用这个计数作为另一个语句的除数。我得到了“不能被零除”的错误,这就是我尝试NVL语句的原因。谢谢。您想在哪一列中使用不同的值计数?在代码中,计算数字1的不同值的数量(正如xQbert指出的,这没有意义)。另外,如果你用它作为除数,从逻辑/代数的角度来看,在大多数情况下,计算distinct是错误的。如果您能更详细地解释这种情况,我们可能可以帮助您在担心要实现的代码之前,先弄清楚这一点。不需要
NVL()
COUNT()
不返回
NULL
比在NVL删除更新中键入错误注释花费的时间更少。(不客气)但这不能处理OP试图消除的除以零的错误。通过首先使用NVL。@xQbert-我主要检查语法错误和其他语法清理(但最后留下了一个大的语法清理)。我认为它应该没有distinct(因为现在它将生成0或1)和一些检查,以将结果中的0更改为1(或其他)。我没有看到任何不匹配的括号,它们在哪里?我确实同意应该在中用
重写条件,正如您所做的那样,我只是对括号感到好奇(我是否遗漏了什么?)