[英]Using case inside where clause
我正在尝试创建一个具有名为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;
我看了很多帖子,但我没有解决这个问题。 有人能帮助我吗?
当您真正想要一个布尔评估的简单组合时,不要在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
然而,这通常不是表达这种情况的最明确的方式。
您无法在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
情况下你想要发生什么。
您可以在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');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.