понедельник, 25 мая 2020 г.

Сгруппировать маски номеров

Сотрудник вводит несколько масок для номеров сотовых телефонов. Формат:  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;

Комментариев нет:

Отправить комментарий