在where子句中使用case语句

7
我正在尝试创建一个过程,其中有一个名为m_reaplicacao的参数。此参数接收值“S”表示是,“N”表示否,“T”表示所有记录。 当参数为Yes时,我应返回值等于9的记录。 当参数为No时,我应返回不等于9的记录。最后,当值为All时,我应返回表中的所有记录。 使用下面的代码,Oracle会显示: MYDB.CONTAS_A_PAGAR_SPS过程编译错误 错误:PL/SQL:ORA-00905:缺少关键字 行:84 文本:ta.id_1a_cbr = 9;
    select * from proposta ta
    where 
          ta.estado = 'RJ'
          and case
               when m_reaplicacao = 'S' then
                    ta.id_1a_cbr = 9;
               when m_reaplicacao = 'N' then
                    ta.id_1a_cbr <> 9
               else null
          end case; 

我看了很多帖子,但是都没有解决我的问题。 请问有人可以帮我吗?


2
使用 END 而不是 END CASE。你可能需要将 m_reaplicacao = 移到 case 语句之外。 - Andrew
糟糕,这应该是在 case 语句之外的 ta.id_1a_cbr - Andrew
3个回答

15
不要在WHERE子句中使用CASE语句,当你只想要一个简单的布尔值组合时。
WHERE ta.estado = 'RJ'
  AND (    m_reaplicacao = 'T'
       OR (m_reaplicacao = 'S' AND ta.id_1a_cbr = 9)
       OR (m_reaplicacao = 'N' AND ta.id_1a_cbr <> 9)
      )

如果您真的想使用CASE语句,那么您需要让CASE返回一个值,并在WHERE子句中进行检查。例如:

WHERE ta.estado = 'RJ'
  AND (CASE WHEN m_reaplicacao = 'S' AND ta.id_1a_cbr = 9 
            THEN 1
            WHEN m_reaplicacao = 'N' AND ta.id_1a_cbr <> 9 
            THEN 1
            WHEN m_reaplicacao = 'T'
            THEN 1
            ELSE 2
        END) = 1

一般情况下,这不是表达这种条件的最清晰方式。


1
为什么要将1与case语句进行比较? - babybob
1
@BabyboBNukes - 如果你使用这种方法,你必须将case语句与某些东西进行比较(就像我说的,我不建议首先使用case)。1只是一个容易返回和比较的值。如果你选择,你可以返回-1、17或'a'并与相同的值进行比较。 - Justin Cave

1

CASE 语句中不能返回表达式,最简单的方法是添加额外的 WHERE 条件集:

select * 
from proposta ta
where ta.estado = 'RJ'
  and (
         (m_reaplicacao = 'S' AND ta.id_1a_cbr = 9)
      OR (m_reaplicacao = 'N' AND ta.id_1a_cbr <> 9)
       )

不确定您希望在 NULL 情况下发生什么。


0

您可以在SELECT语句中使用CASE,例如:

with d as (
  select 'A' as val from dual
  union
  select 'B' as val from dual
  union
  select 'C' as val from dual
)
select *
from d
where 
    case 
        when val = 'A' then 1
        when val = 'B' then 1
        when val = 'Z' then 1
    end = 1; 

在这里,我们正在寻找val值为('A','B','Z')的行。在这个例子中,这是另一种写法:

select ... where val in ('A','B','Z');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接