2011-09-29 124 views
1

新to SQL和我剛剛創建了assitance SQL查詢:CASE查詢澄清

 SELECT CASE 

    WHEN exists (SELECT CLIENT_CODE FROM STG_DM_CLIENT  
     WHERE CLIENT_CODE 
     NOT IN (SELECT CLIENT_CODE FROM DM_CLIENT)) THEN 'A' 
     else 

WHEN exists (SELECT STG.CLIENT_CODE AS TRAN_TYPE 
    FROM STG_DM_CLIENT STG   
    JOIN DM_CLIENT SRC 
    ON SRC.CLIENT_CODE = STG.CLIENT_CODE 
    WHERE (SRC.CLIENT_NAME <> STG.CLIENT_NAME)) THEN 'C' 
    END 
FROM DM_CLIENT, STG_DM_CLIENT 

未能提供正確的resulset,指出未來incorect語法時

消息156,15級,狀態1,行8 關鍵字'WHEN'附近的語法不正確。

任何想法,我做錯了什麼

回答

0

目前還不清楚你的事後,這是最接近的有效陳述;

SELECT 
    CASE WHEN EXISTS (...) 
     THEN 'A' 
    ELSE 
     CASE WHEN EXISTS (...) 
      THEN 'C' 
      ELSE 'Neither exists()' 
     END 
    END 

當第一個存在匹配,你會得到一個
當第一個不存在,您會得到C如果第二個不匹配

2

你只希望能有一個最後的ELSE聲明。正確的格式是一樣的東西:

CASE WHEN <condition 1> THEN <output 1> 
    WHEN <condition 2> THEN <output 2> 
    -- Optional, if left out assumes NULL for unhandled conditions 
    [ELSE <output 3> ] 
    END 

當你把ELSE第一個條件後發動機預計的最終輸出,而不是其他條件。

+0

如果你離開它沒有'ELSE ',它被視爲'ELSE NULL'。 –

+1

@ypercube - 好點,我會補充說。最近我有一個同事咬一個更新,保持設置爲'NULL' :) – JNK

1

讓我格式化你的榜樣(無modificiation),從而使結構變得可見:

SELECT CASE WHEN exists (SELECT CLIENT_CODE FROM STG_DM_CLIENT  
         WHERE CLIENT_CODE NOT IN (SELECT CLIENT_CODE FROM DM_CLIENT)) 
      THEN 'A' 
      else WHEN exists (SELECT STG.CLIENT_CODE AS TRAN_TYPE 
           FROM STG_DM_CLIENT STG   
             JOIN DM_CLIENT SRC 
             ON SRC.CLIENT_CODE = STG.CLIENT_CODE 
           WHERE (SRC.CLIENT_NAME <> STG.CLIENT_NAME)) 
       THEN 'C' 
       END 
    FROM DM_CLIENT, STG_DM_CLIENT 

所以,你的結構是:

CASE WHEN ... THEN ... 
     ELSE WHEN ... THEN ... 
      END 

這是不正確的。所以

CASE WHEN ... THEN ... 
     WHEN ... THEN ... 
     [ELSE ...] 
    END 

,從原來的語句刪除else,你應該是:您可以將其更改爲兩個嵌套的case語句(完整的CASE和END):

CASE WHEN ... THEN ... 
     ELSE CASE WHEN ... THEN ... 
      END 
    END 

或(更好)精細。

+0

您的重新格式化的例子仍然不正確... ...否則WHEN存在...'是問題 – JNK

+0

@JNK:的確如此:我重新格式化了他的原始示例(沒有修改,以便錯誤變得可見)。感謝您的反饋,我會在我的回答中澄清這一點。 – Heinzi