比较Oracle中的2个列表

时间:2019-01-07 21:50:22

标签: sql oracle

我有2个列表需要比较。我需要查找是否在列表B中至少找到了列表A中的一个元素。我知道IN不适用于2个列表。我还有其他选择吗?

基本上是这样的:

SELECT 
CASE WHEN ('A','B','C') IN ('A','Z','H') THEN 1 ELSE 0 END "FOUND"
FROM DUAL

不胜感激!

5 个答案:

答案 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