2011-06-15 66 views
2

我有一個存儲過程。我正在傳遞一個布爾值,例如IS_ELIGIBLE。 現在我希望能夠寫出查詢是這樣的:Oracle CASE聲明?

SELECT col1, 
     CASE 
      WHEN IS_ELIGIBLE THEN col2 * 100 
     ELSE 
      col2 * 50 
     END 
     INTO OUT_COL1, OUT_SCORE 
FROM TABLE_NAME 

的問題是,因爲IS_ELIGIBLE不TABLE_NAME列之一,查詢錯誤的。我可以使用if..else ie編寫相同的查詢。

IF IS_ELIGIBLE 
    SELECT col1, col2 * 100 
ELSE 
    SELECT col1, col2 * 50 
END 

但我會重複選擇語句兩次。我知道我可以創建函數來獲得該選擇語句,以便我不必重複兩次。但我只是好奇,如果它可以做,而不做如果..使用或創建新的功能? 謝謝。

回答

7

的問題不在於IS_ELIGIBLE是不是在表中的列,但它是一個布爾和SQL不能處理的布爾值(我知道,不要問)。所以你需要引入另一個變量,如下所示:

IS_ELIGIBLE_NUM NUMBER := CASE WHEN IS_ELIGIBLE THEN 1 ELSE 0 END; 
.. 
SELECT col1, 
    CASE 
     WHEN IS_ELIGIBLE_NUM = 1 THEN col2 * 100 
    ELSE 
     col2 * 50 
    END 
    INTO OUT_COL1, OUT_SCORE 
FROM TABLE_NAME 
2

布爾型不是SQL引擎的有效類型。
您將不得不爲受支持的類型使用一個臨時變量。然而,如果這真的是你的SProc的一個參數,那麼它對任何給定的調用都是有限的。

那麼,爲什麼不這樣做,像這樣:

someVarForCol2 TABLE_NAME.col2%type; 
begin 
    SELECT col1, col2 
    INTO OUT_COL1, someVarForCol2 
    FROM TABLE_NAME; 

    OUT_SCORE := CASE WHEN IS_ELIGIBLE THEN someVarForCol2 * 100 ELSE someVarForCol2 * 50 END;