Можно ли проверить, есть ли значение в списке элементов в одной функции Oracle Decode? - PullRequest
1 голос
/ 30 января 2012

Я хотел бы знать, что если я могу сравнить значение со списком элементов в функции декодирования. По сути, я хочу знать, что, если возможно, сделать оператором декодирования ' search ' значение списка. Например,

decode(task_id, (1,2,3), 3 * task_time) 

Этот фрагмент кода не скомпилируется. Тогда это единственный вариант для этого случая (без использования case-when ) или есть альтернативные способы сделать это?

decode(task_id, 1, 3 * task_time,
                2, 3 * task_time,
                3, 3 * task_time)

Я использую Oracle 10gR2. Любая помощь очень ценится.

Ответы [ 6 ]

6 голосов
/ 30 января 2012

Если достаточно одного списка значений, вы можете превратить его в предложения CASE и IN:

case when task_id in (1, 2, 3) then 3 * task_time else null end
1 голос
/ 30 января 2012

decode ( (taskid-1)*(taskid-2)*(taskid-3), 0, 3 * tasktime ) может делать то, что вы хотите

Вот рабочий пример:

with a as (
  select 1 taskid, 11 tasktime from dual union all
  select 2 taskid, 11 tasktime from dual union all
  select 3 taskid, 11 tasktime from dual union all
  select 4 taskid, 11 tasktime from dual
)
select 
  taskid,
  decode (
    (taskid-1) *
    (taskid-2) *
    (taskid-3) ,
    0, 3 * tasktime 
)                                  decoded
from a;
1 голос
/ 30 января 2012

Я нашел решение:)

select 
    decode(
          task_id, 
          (select task_id from dual where task_id in (1,2,3)), 
          3*task_time) 
1 голос
/ 30 января 2012

Я не думаю, что таким способом можно использовать список с декодированием. Согласно документации:

DECODE сравнивает expr с каждым поисковым значением по одному. Если expr равен к поиску, то Oracle Database возвращает соответствующий результат. Если совпадений не найдено, Oracle возвращает значение по умолчанию

Таким образом, task_id сравнивается со значением поиска один за другим. Если в качестве значения поиска использовался список, вы не могли бы сравнить его с одним значением.

0 голосов
/ 05 мая 2017

В случае если:

IF vVal in (3,1,2) THEN
     dbms_output.put_line('FOUND');
   ELSE
    dbms_output.put_line('NOT FOUND');
   END IF;
0 голосов
/ 30 января 2012

Вы можете использовать объединение всех:

select 3 * task_time from your_table where task_id in (1,2,3)
union all
select task_time from your_table where task_id not in (1,2,3)

но почему?

...