Oracle PL/SQL CASE 语句可以包含 SELECT 查询吗?

Can Oracle PL/SQL CASE statement include a SELECT query?

我正在尝试做类似的事情:

CASE
 WHEN number IN (1,2,3) THEN 'Y' ELSE 'N' END;

相反,我想在列表的位置进行查询,如下所示:

CASE
 WHEN number IN (SELECT num_val FROM some_table) THEN 'Y' ELSE 'N' END;

我似乎无法让它工作。另外,这里是一个查询示例。

    SELECT number, (CASE
     WHEN number IN (SELECT num_val FROM some_table) THEN 'Y' ELSE 'N' END) AS YES_NO 
    FROM some_other_table;

我建议使用 OUTER JOIN 而不是尝试在 CASE 表达式中使用子查询:

SELECT t.NUMBER, 
       CASE
         WHEN s.NUM_VAL IS NOT NULL THEN 'Y'
         ELSE 'N'
       END AS YES_NO
  FROM SOME_OTHER_TABLE t
  LEFT OUTER JOIN SOME_TABLE s
    ON s.NUM_VAL = t.NUMBER

祝你好运。

是的,这是可能的。请参阅下面的示例,该示例将按照您的意图进行。不同之处在于它使用 EXISTS 而不是 IN.

SELECT a.number, 
       (CASE WHEN EXISTS (SELECT null FROM some_table b where b.num_val = a.number)
             THEN 'Y'
             ELSE 'N'
        END) AS YES_NO 
    FROM some_other_table a;

编辑: 我承认:我个人更喜欢其他人给出的答案。

但是,根据您的数据,此查询与其他查询之间会有差异。

如果 table some_other_table 中的值 number 您可以在 table some_table 中有多个 num_val 的匹配条目,那么其他答案将 return 重复行。这个查询不会。

就是说,如果您采用其他人给出的 left join 个查询,并添加一个 group by,那么您将不会得到重复项。

看来您只需要加入表格并进行解码即可。

with x as
(
    select 1 as num from dual
    union
    select 2 as num from dual
    union
    select 3 as num from dual
),
y as 
(
    select 1 as num from dual
    union
    select 2 as num from dual
    union
    select 4 as num from dual
)
select x.num, decode(y.num, null, 'N','Y') as yes_no
from x
left outer join y on (x.num = y.num)

输出:

NUM YES_NO
1   Y
2   Y
3   N

您可以在 case 语句中使用子查询:

select 假人 when 'X' then (select 'TRUE' from dual) 否则 'FALSE' 结束测试 来自双重;

测试

正确

select 案例(select 'XXX' 来自双重) 当 'XXX' 然后 'TRUE' 否则 'FALSE' 结束测试 来自双重;

测试

正确