【问题标题】:Using case inside where clause在 where 子句中使用 case
【发布时间】:2014-06-16 17:45:56
【问题描述】:

我正在尝试创建一个具有名为 m_reaplicacao 的参数的过程。此参数接收值“S”表示“是”,“N”表示“否”,“T”表示所有记录。 当参数为 Yes 时,我应该返回值为 9 的记录。 当参数为 No 时,我应该返回与 9 不同的记录。最后,当值为 All 时,我应该返回表中的所有记录。 通过下面的代码,Oracle 说: PROCEDURE 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; 

我看了很多帖子,但我没有解决这个。 有人可以帮帮我吗?

【问题讨论】:

  • 使用END 而不是END CASE。您可能需要将m_reaplicacao = 移到案例陈述之外。
  • 哎呀,这应该是 ta.id_1a_cbr 在 case 语句之外。

标签: sql oracle plsql


【解决方案1】:

当您确实需要简单的布尔计算组合时,不要在 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和case语句比较?
  • @BabyboBNukes - 如果您使用这种方法,您必须将case 声明与某些东西进行比较(就像我说的,我不建议首先使用case)。 1 只是一个易于返回和比较的值。如果您愿意,您可以返回 -1 或 17 或 'a' 并与相同的值进行比较。
【解决方案2】:

您不能在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 情况下发生什么。

【讨论】:

    【解决方案3】:

    您可以在选择语句中使用 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');
    

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 1970-01-01
      • 2021-03-14
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多