Oracle

SQL case 語句未執行“else”

  • August 1, 2018

我在 Oracle 12.1.0.2.0 上我有一個使用 CASE 語句編寫的查詢。我有 2 個“WHEN”語句和一個“ELSE”語句。除“ELSE”語句外,查詢按預期工作。我沒有收到任何語法錯誤,只是在應該的情況下沒有達到“ELSE”大小寫,而是什麼也不返回。

SELECT 
CASE
WHEN COUNT(COLUMN_A) = 1
   THEN 'PASS'
WHEN COUNT(COLUMN_A) > 1
   THEN 'FAIL'
ELSE 'DOES NOT EXIST'
END AS TEST,
SCH.COLUMN_A
FROM SCHEMA.TABLE_A SCH
WHERE SCH.COLUMN_A = 'NA'
GROUP BY COLUMN_A

當我執行此查詢時(在我的理解中是 else 情況),它會返回 0,因為它應該:

SELECT COUNT(COLUMN_A) < 1
FROM SCHEMA.TABLE_A SCH
WHERE SCH.COLUMN_A = 'NA'

如果您需要提供表結構,請告訴我,但它相當簡單。

我究竟做錯了什麼?為什麼當查詢返回 0 時,else 語句沒有返回“DOES NOT EXIST”?我有一種感覺,這很簡單,但我被卡住了,需要一些幫助。我很感激。

你使用了這個謂詞:COLUMN_A = 'NA'

COUNT(COLUMN_A)僅當您有 0 行 where COLUMN_A = 'NA'(因為謂詞而排除空值)時,結果才能為 0。如果您有 0 行,CASE則根本不評估該語句,並且上述查詢不返回任何結果。

即使沒有行與您的謂詞匹配,您也需要一個返回結果的查詢。例如:

SELECT 
 CASE
   WHEN C = 1
     THEN 'PASS'
   WHEN C > 1
     THEN 'FAIL'
   ELSE 'DOES NOT EXIST',
   'NA'
FROM
(
 SELECT COUNT(*) AS C
 FROM SCHEMA.TABLE_A SCH
 WHERE SCH.COLUMN_A = 'NA'
);

如果沒有 COLUMN_A = ‘NA’ 的記錄,則輸出中將沒有記錄。

使用類似的東西

SELECT 
CASE
WHEN COUNT(SCH.COLUMN_A) = 1
   THEN 'PASS'
WHEN COUNT(SCH.COLUMN_A) > 1
   THEN 'FAIL'
ELSE 'DOES NOT EXIST'
END AS TEST,
SCH.COLUMN_A
FROM (SELECT 'NA' COLUMN_A) dummy
LEFT JOIN SCHEMA.TABLE_A SCH ON SCH.COLUMN_A = dummy.COLUMN_A
/* GROUP BY SCH.COLUMN_A */

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