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'
结束测试
来自双重;
测试
正确
我正在尝试做类似的事情:
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' 结束测试 来自双重;
测试
正确