簡體   English   中英

Oracle CASE聲明?

[英]Oracle CASE statement?

我有一個存儲過程。 我在哪里傳遞一個布爾值,例如IS_ELIGIBLE。 現在我希望能夠編寫如下的查詢:

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

但我會重復兩次選擇聲明。 我知道我可以創建具有select語句的函數,這樣我就不必重復兩次了。 但我只是好奇是否可以在不執行if..else或創建新功能的情況下完成? 謝謝。

問題不在於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

Boolean不是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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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