在where子句中使用case

Rod*_*uza 3 sql oracle plsql

我正在尝试创建一个具有名为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; 
Run Code Online (Sandbox Code Playgroud)

我看了很多帖子,但我没有解决这个问题.有谁可以帮助我吗?

Jus*_*ave 8

当你真的想要一个简单的布尔评估组合时,不要CASEWHERE子句中使用语句.

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)
      )
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因你真的想要使用一个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
Run Code Online (Sandbox Code Playgroud)

然而,这通常不是表达这种情况的最明确的方式.