Oracle CASE заявление? - PullRequest
       16

Oracle CASE заявление?

2 голосов
/ 15 июня 2011

У меня есть сохраненный процесс.где я передаю логическое значение, например, 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 т.е..

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

Но я буду повторять оператор выбора дважды.Я знаю, что могу создать функцию для этого оператора select, чтобы мне не приходилось повторять дважды.Но мне было просто любопытно, можно ли это сделать, не делая if..else или создавая новую функцию?Благодарю.

Ответы [ 2 ]

7 голосов
/ 15 июня 2011

Проблема не в том, что 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 голосов
/ 15 июня 2011

Логический тип недопустим для механизма 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...