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

时间:2015-06-12 18:55:01

标签: sql oracle plsql case plsqldeveloper

我试图做类似的事情:

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;

4 个答案:

答案 0 :(得分:2)

是的,这是可能的。请参阅下面的示例,该示例可以执行您的预期操作。不同之处在于它使用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;

修改 我承认:我更喜欢别人给出的答案。

但是,根据您的数据,此查询与其他查询之间会有所不同。

如果表number中的值为some_other_table,则表num_val中的some_table可以有许多匹配的条目,则其他答案将返回重复的行。此查询不会。

也就是说,如果您接受其他人提出的left join次查询,并添加group by,那么您将无法获得重复项。

答案 1 :(得分:0)

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

layer.setValue(value: NSValue(nonretainedObject: self), forKey: "ActionViewItem")

ActionView.swift:72:19: Cannot invoke 'setValue' with an argument list of type '(value: NSValue, forKey: String)'

祝你好运。

答案 2 :(得分:0)

好像你只需要加入表并进行解码。

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

答案 3 :(得分:0)

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

选择 案例假人 当“X”然后(从双重选择“真”) 否则'假' 结束测试 从双;

测试

正确

选择 案例(从双重选择“XXX”) 当“XXX”然后“真” 否则'假' 结束测试 从双;

测试

正确