Сравнение 2 списков в Oracle - PullRequest
0 голосов
/ 08 января 2019

У меня есть 2 списка, которые мне нужно сравнить. Мне нужно найти, если хотя бы один элемент из списка A найден в списке B. Я знаю, что IN не работает с 2 списками. Какие у меня есть другие варианты?

В основном как-то так:

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

Буду признателен за любую помощь!

Ответы [ 4 ]

0 голосов
/ 08 января 2019

Если вы работаете с коллекцией String, вы можете попробовать Multiset Operators.

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'));

Дополнительно:

-- union of elemtns
select * from table(coll_of_varchar2('A','B','C') multiset union distinct coll_of_varchar2('A','Z','H'));
select * from table(coll_of_varchar2('A','B','C') multiset union all coll_of_varchar2('A','Z','H'));

-- eelemnt from col1 not in col2
select * from table(coll_of_varchar2('A','A','B','C') multiset except all coll_of_varchar2('A','Z','H'));
select * from table(coll_of_varchar2('A','A','B','C') multiset except distinct coll_of_varchar2('A','Z','H'));

-- check if col1 is subset col2
select * from dual where coll_of_varchar2('B','A') submultiset coll_of_varchar2('A','Z','H','B');
0 голосов
/ 08 января 2019

В 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;
0 голосов
/ 08 января 2019

Вы, наверное, ищете что-то подобное. Предложение 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
0 голосов
/ 08 января 2019

Вам необходимо повторить условия:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...