Выглядит сложным, но это всего лишь пара вспомогательных функций для разбиения списка на отдельные значения (чтобы быть включенным в тип таблицы), а затем очень простая функция для проверки пересечения двух коллекций. Настройка
Oracle:
CREATE TYPE VARCHAR2s_Table AS TABLE OF VARCHAR2(4000);
CREATE FUNCTION regexp_escape(
expression VARCHAR2
) RETURN VARCHAR2 DETERMINISTIC
AS
BEGIN
RETURN REGEXP_REPLACE(expression, '([$^[()+*?{\|])', '\\\1', 1, 0, 'c');
END;
/
CREATE FUNCTION splitList(
list VARCHAR2,
delim VARCHAR2 := ','
) RETURN VARCHAR2s_Table DETERMINISTIC
AS
pattern VARCHAR2(256);
len BINARY_INTEGER;
t_items VARCHAR2s_Table := VARCHAR2s_Table();
BEGIN
IF list IS NULL THEN
NULL;
ELSIF delim IS NULL THEN
t_items.EXTEND(LENGTH(list));
FOR i IN 1 .. LENGTH(list) LOOP
t_items(i) := SUBSTR(list, i, 1);
END LOOP;
ELSE
pattern := '(.*?)($|' || REGEXP_ESCAPE(delim) || ')';
len := REGEXP_COUNT(list, pattern) - 1;
t_items.EXTEND(len);
IF len = 1 THEN
t_items(1) := list;
ELSE
FOR i IN 1 .. len LOOP
t_items(i) := REGEXP_SUBSTR(list, pattern, 1, i, NULL, 1);
END LOOP;
END IF;
END IF;
RETURN t_items;
END;
/
CREATE FUNCTION check_list_intersect(
list1 VARCHAR2,
list2 VARCHAR2
) RETURN NUMBER DETERMINISTIC
AS
BEGIN
IF splitList(list1) MULTISET INTERSECT splitList(list2) IS EMPTY THEN
RETURN 0;
ELSE
RETURN 1;
END IF;
END;
/
Запрос 1:
SELECT check_list_intersect('abc,def,ghi', 'abc') AS matches
FROM DUAL;
Результаты:
MATCHES
---------
1
Query 2:
SELECT check_list_intersect('abc,def,ghi', 'abcd') AS matches
FROM DUAL;
Результаты:
MATCHES
---------
0
Вы можете разделить строки с разделителями в виде строк, а затем сравнить. См. [** Разделите строки с разделителями-запятыми в таблице в Oracle **] (http://lalitkumarb.com/2015/03/04/split-comma-delimited-strings-in-a-table-in-oracle/) –