我有2个列表需要比较。我需要查找是否在列表B中至少找到了列表A中的一个元素。我知道IN不适用于2个列表。我还有其他选择吗?
基本上是这样的:
SELECT
CASE WHEN ('A','B','C') IN ('A','Z','H') THEN 1 ELSE 0 END "FOUND"
FROM DUAL
不胜感激!
答案 0 :(得分:2)
在Oracle中,您可以执行以下操作:
select
count(*) as total_matches
from table(sys.ODCIVarchar2List('A', 'B', 'C')) x,
table(sys.ODCIVarchar2List('A', 'Z', 'H')) y
where x.column_value = y.column_value;
答案 1 :(得分:2)
您可能正在寻找类似的东西。 WITH子句只是用来模拟您的“列表”(无论您要说的是什么);它们并不是解决方案的真正组成部分。您需要的查询只是最后三行(末尾加分号)。
with
first_list (str) as (
select 'A' from dual union all
select 'B' from dual union all
select 'C' from dual
),
second_list(str) as (
select 'A' from dual union all
select 'Z' from dual union all
select 'H' from dual
)
select case when exists (select * from first_list f join second_list s
on f.str = s.str) then 1 else 0 end as found
from dual
;
FOUND
----------
1
答案 2 :(得分:1)
您需要重复条件:
SELECT (CASE WHEN 'A' IN ('A', 'Z', 'H') OR
'B' IN ('A', 'Z', 'H') OR
'C' IN ('A', 'Z', 'H')
THEN 1 ELSE 0
END) as "FOUND"
FROM DUAL
答案 3 :(得分:0)
如果您正在处理String的集合,则可以尝试使用Multiset Operators。
insert into wccrm_orders (year) values(SELECT YEAR(ordered_date) from wccrm_orders)
和:
create type coll_of_varchar2 is table of varchar2(4000);
另外:
-- check if exits
select * from dual where cardinality (coll_of_varchar2('A','B','C') multiset intersect coll_of_varchar2('A','Z','H')) > 0;
-- list of maching elments
select * from table(coll_of_varchar2('A','B','C') multiset intersect coll_of_varchar2('A','Z','H'));
答案 4 :(得分:0)
我正在尝试做非常相似的事情,但是第一个列表是使用listagg创建的同一查询上的另一个字段,并且包含如下整数:
LISTAGG(my_first_list,', ') WITHIN GROUP(
ORDER BY
my_id
) my_first_list
并将其与我已经返回的所有其他字段一起返回
SELECT
CASE WHEN my_first_list IN ('1,2,3') THEN 1 ELSE 0 END "FOUND"
FROM DUAL