Вы получаете только одно совпадение, поскольку используемые вами функции (split_part
,regexp_substr
) возвращают n-й элемент совпадения.
Самый наивный подход к решению этой проблемы:
select regexp_substr(split_part('ABC1,ABC2,WWW1,WWW2,ABC3,WWW3,WWW4,ABC4',',',1),'ABC[^"]*')
union all
select regexp_substr(split_part('ABC1,ABC2,WWW1,WWW2,ABC3,WWW3,WWW4,ABC4',',',2),'ABC[^"]*')
union all
...
select regexp_substr(split_part('ABC1,ABC2,WWW1,WWW2,ABC3,WWW3,WWW4,ABC4',',',20),'ABC[^"]*')
Чтобы улучшить это, вам нужно сначала преобразовать значение с разделителями-запятыми в несколько строк, а затем использовать регулярное выражение. Это можно сделать разными способами, см. этот пост для более подробной информации. .
Результат: ABC1 ABC2
Сложность здесь заключается в отсутствии функции генерации таблицы для разделения значения с разделителями-запятыми на несколько строк.
person
Yosi Dahari
schedule
30.09.2019
split_part
, так иregexp_substr
возвращаются при n-м совпадении. Не все совпадают. Чтобы получить то, что вы хотите, вам нужно ПЕРЕКРЕСТИТЬ СОЕДИНЕНИЕ с таблицей, содержащей числа 1..100 (или любое максимальное количество слов, которые вам нужно извлечь) и применить функции к каждому индексу, эффективно превращая список в несколько строк. Затем выберите нужные строки. Пример см. здесь. - person nimrodm   schedule 30.09.2019