Сотрудник вводит несколько масок для номеров сотовых телефонов. Формат: 89087ХХХХХХ, 8908673ХХХХ, 890867ХХХХХ и т.п.
Необходимо исключить из списка те маски, которые входят в более широкий спектр номеров. Например в 890867ХХХХХ входят 8908671ХХХХ и 8908672ХХХХ. В результате должно остаться только 890867ХХХХХ.
Решение 1:
WITH list_str AS
(SELECT regexp_substr('8908673,89086759,89086737,8908673,890867597', '[^,]+', 1, LEVEL) cl
FROM dual
CONNECT BY LEVEL <= regexp_count('8908673,89086759,89086737,8908673,890867597', ',') + 1)
SELECT DISTINCT (SELECT MIN(t.cl) keep(dense_rank FIRST ORDER BY t.cl)
FROM list_str t
WHERE instr(ts.cl, t.cl) = 1) AS roots
FROM list_str ts;
Решение 2:
WITH xml_root AS
(SELECT regexp_substr('8908673,89086759,89086737,8908673,890867597', '[^,]+', 1, LEVEL) cl
FROM dual
CONNECT BY LEVEL <= regexp_count('8908673,89086759,89086737,8908673,890867597', ',') + 1)
SELECT DISTINCT cl
FROM (SELECT cl,
connect_by_isleaf AS root
FROM xml_root t CONNECT BY nocycle instr(PRIOR t.cl, t.cl) = 1)
WHERE root = 1;
Комментариев нет:
Отправить комментарий