簡體   English   中英

在where子句中使用case

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM