是否可以检查单个Oracle解码函数中的项目列表中是否有值?

是否可以检查单个Oracle解码函数中的项目列表中是否有值?,oracle,decode,Oracle,Decode,我想知道,如果我可以比较解码函数中的值和项目列表。基本上,我想知道是否有可能将解码语句的“搜索”值作为一个列表。比如说, decode(task_id, (1,2,3), 3 * task_time) 但这段代码无法编译。如果不使用case,那么这是本案例的唯一选项吗?或者有其他方法可以这样做吗 decode(task_id, 1, 3 * task_time, 2, 3 * task_time, 3, 3 * task_tim

我想知道,如果我可以比较解码函数中的值和项目列表。基本上,我想知道是否有可能将解码语句的“搜索”值作为一个列表。比如说,

decode(task_id, (1,2,3), 3 * task_time) 
但这段代码无法编译。如果不使用case,那么这是本案例的唯一选项吗?或者有其他方法可以这样做吗

decode(task_id, 1, 3 * task_time,
                2, 3 * task_time,
                3, 3 * task_time)
我正在使用Oracle 10gR2。非常感谢您的帮助。

您可以使用union all:

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)
但是为什么呢?

您可以使用union all:

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)

但是为什么呢?

如果一个值列表就足够了,您可以将其转换为CASE和IN子句:


如果单个值列表足够,则可以将其转换为CASE和IN子句:


我认为用这种方式使用带有解码的列表是不可能的。根据文件:

解码将expr与每个搜索值逐一进行比较。如果expr等于 进行搜索,然后Oracle数据库返回相应的结果。如果 未找到匹配项,则Oracle返回默认值


因此,任务id将与搜索值逐一进行比较。如果搜索值是一个列表,则无法与单个值进行比较。

我认为不可能以这种方式使用带有解码的列表。根据文件:

解码将expr与每个搜索值逐一进行比较。如果expr等于 进行搜索,然后Oracle数据库返回相应的结果。如果 未找到匹配项,则Oracle返回默认值

因此,任务id将与搜索值逐一进行比较。如果搜索值是一个列表,则无法与单个值进行比较。

我找到了一个解决方案:

select 
    decode(
          task_id, 
          (select task_id from dual where task_id in (1,2,3)), 
          3*task_time) 
我找到了一个解决方案:

select 
    decode(
          task_id, 
          (select task_id from dual where task_id in (1,2,3)), 
          3*task_time) 
解码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;
解码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;
在if条件下:

IF vVal in (3,1,2) THEN
     dbms_output.put_line('FOUND');
   ELSE
    dbms_output.put_line('NOT FOUND');
   END IF;
在if条件下:

IF vVal in (3,1,2) THEN
     dbms_output.put_line('FOUND');
   ELSE
    dbms_output.put_line('NOT FOUND');
   END IF;
我看到了。。。静态字符串用于快速确定某个值是否为您要查找的多个值之一,作为返回值的条件。您可能需要选择一个分隔符,但由于数据集有限,您甚至可以忽略它。它避免了使用case-when、子查询和PL/SQL。据我所知,没有比这更快捷的方法了:

decode(instr('123', taskid), 0, null, taskid * 3)
当您想要设置异常(例如,如果taskid等于1,则返回taskid而不进行乘法)时,它也非常方便:

我看到了。。。静态字符串用于快速确定某个值是否为您要查找的多个值之一,作为返回值的条件。您可能需要选择一个分隔符,但由于数据集有限,您甚至可以忽略它。它避免了使用case-when、子查询和PL/SQL。据我所知,没有比这更快捷的方法了:

decode(instr('123', taskid), 0, null, taskid * 3)
当您想要设置异常(例如,如果taskid等于1,则返回taskid而不进行乘法)时,它也非常方便:


就像我在问题中说的,我想知道是否有可能在不使用case-when子句的情况下使用decode函数,我想知道是否有可能在不使用case-when子句的情况下使用decode函数。虽然我理解您不愿意使用case语句,但我认为它们看起来并不干净,它们比decode功能强大得多,可以在更多的地方使用,并且可以跨RDBMS转移@科多的答案正是你需要的答案。这个问题很难回答。但是为什么不使用用例呢?你从解码中受益吗?这个问题只是我个人兴趣的结果。此外,在我用大数据填充相关表之后,我想测试decode function vs case子句。为什么你想让DECODE做一些它做不到的事情,而不是使用能做到的用例呢?好的。大多数答案和评论都证明在我的案例中使用case子句是理想的解决方法。所以,我要用@Codo的答案。谢谢大家的回答。虽然我理解你们不愿意使用案例陈述——我认为它们看起来不干净——但它们比解码功能强大得多,可以在更多的地方使用,并且可以跨RDBMS转移@科多的答案正是你需要的答案。这个问题很难回答。但是为什么不使用用例呢?你从解码中受益吗?这个问题只是我个人兴趣的结果。此外,在我用大数据填充相关表之后,我想测试decode function vs case子句。为什么你想让DECODE做一些它做不到的事情,而不是使用能做到的用例呢?好的。大多数答案和评论都证明在我的案例中使用case子句是理想的解决方法。所以,我要用@Codo的答案。谢谢大家的回答。非常聪明,但这是在Oracle7时代必须解决的问题。OP在Oracle10g上,应该只是用例。非常聪明,但这是一种解决方法 在Oracle7时代,ich是必要的。OP在Oracle 10g上,应该只使用CASE.or decodetask\u id,decodetask\u id,1,task\u id,2,task\u id,3,task\u id,3*task\u timeor decodetask\u id,decodetask\u id,1,task\u id,2,task\u id,3,task\u id,3*task\u time