Oracle CASE声明?

时间:2011-06-15 13:17:32

标签: sql oracle stored-procedures plsql

我有一个存储过程。我在哪里传递一个布尔值,例如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或创建新功能的情况下完成? 谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;