[英]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.