Как найти, является ли список подсписком другого списка?

Хочу найти, является ли список подсписком другого списка.

Это фрагмент кода процедуры:

TYPE TYPE_LIST IS TABLE OF VARCHAR(200);
CHILD_ITEMS TYPE_LIST;
PARENT_ITEMS TYPE_LIST := TYPE_LIST('item1','item2','item3','item4','item5');

SELECT A.NAME BULK COLLECT INTO CHILD_ITEMS 
FROM TABLE_A A, TABLE_B B WHERE A.ID = B.ITEM_ID;

Надо проверить, является ли CHILD_ITEMS подсписком PARENT_ITEMS, то есть, все элементы CHILD_ITEMS являются частью PARENT_ITEMS. Например:

  • CHILD_ITEMS содержит 'item1','item2' - условие вернёт true,
  • а если содержит 'item1','item2','item100', то false, т.к. 'item100' не являются частью PARENT_ITEMS.

Как написать IF условие в этом случае?


Свободный перевод вопроса Check whether a list is sublist of another list in Oracle PL/SQL от участника @VGH


Ответы (1 шт):

Автор решения: 0xdb

Надо воспользоваться SUBMULTISET условием. Например:

declare 
    type itemList is table of varchar(8);
    childItems itemList  := itemList ('item2','item3','item4');
    parentItems itemList := itemList ('item1','item2','item3','item4','item5');
begin
    if childItems submultiset of parentItems then
        dbms_output.put_line ('is subset');
    else 
        dbms_output.put_line ('is not subset'); end if;
        
    childItems.extend;
    childItems(childItems.last) := 'item100';
    
    if childItems submultiset of parentItems then
        dbms_output.put_line ('is subset');
    else 
        dbms_output.put_line ('is not subset'); end if;
end;
/

is subset
is not subset

→ Ссылка