Oracle

是否可以將 CASE 語句嵌套到 WHERE 子句中?

  • July 27, 2021

我正在使用 FastAPI 開發應用程序。它包含一個函式,該函式使用此處sqlalchemy.sql.text所示的 將兩個變數帶入 SQL 查詢。

SELECT ATTR3
FROM TABLE
WHERE ATTR1 = TO_NUMBER(:var1)
 AND (CASE
         WHEN TO_NUMBER(:var1) NOT IN (1460, 1478, 1481) THEN 'ATTR2 IS NULL'
         ELSE ATTR2 = TO_NUMBER(:var2)
     END);

因此,粘貼變數後,SQL 查詢將如下所示

SELECT ATTR3
FROM TABLE
WHERE ATTR1 = TO_NUMBER('1460')
 AND (CASE
          WHEN TO_NUMBER('1460') NOT IN (1460, 1478, 1481) THEN 'ATTR2 IS NULL'
          ELSE ATTR2 = TO_NUMBER('000')
      END);

但是,我收到以下錯誤:

ORA-00905: 缺少關鍵字

所以,現在我想知道如何解決這個問題?以及是否可以將 CASE 語句嵌套到 WHERE 子句中?

m條SQL語句的邏輯如下:

邏輯

我看過一些相關的主題,但它們沒有幫助。

我不清楚您要做什麼,所以這是一個瘋狂的猜測:

SELECT ATTR3
FROM TABLE
WHERE ATTR1 = TO_NUMBER(:var1)
 AND ((TO_NUMBER(:var1) NOT IN (1460, 1478, 1481) AND ATTR2 IS NULL)
      OR
      (TO_NUMBER(:var1) IN (1460, 1478, 1481) AND ATTR2 = TO_NUMBER(:var2))
      ;

為了清楚起見,我添加了一些多餘的括號。使用聯合是另一種可能性:

SELECT ATTR3
FROM TABLE
WHERE ATTR1 = TO_NUMBER(:var1)
 AND TO_NUMBER(:var1) NOT IN (1460, 1478, 1481) 
 AND ATTR2 IS NULL
UNION
SELECT ATTR3
FROM TABLE
WHERE ATTR1 = TO_NUMBER(:var1)
 AND TO_NUMBER(:var1) IN (1460, 1478, 1481) 
 AND ATTR2 = TO_NUMBER(:var2)

添加一個db<>fiddle或與您的文章類似的內容,以及預期的輸出(如果這不能解決您的問題)。

引用自:https://dba.stackexchange.com/questions/295990