2011-06-15 75 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;