Redshift получает шаблоны Word из строки

У меня есть строка в столбце 'ABC1,ABC2,WWW1,WWW2,ABC3,WWW3,WWW4,ABC4'. Мне нужно извлечь слова, начинающиеся только с ABC. Ожидаемые результаты должны быть

АВС1, АВС2, АВС3, АВС4

Я пробовал рев, но не работал

select regexp_substr(split_part('ABC1,ABC2,WWW1,WWW2,ABC3,WWW3,WWW4,ABC4',',',1),'ABC[^"]*')

Я получаю только первое появление: как ABC1. Как получить все вхождения ABC*


person Sachin Sukumaran    schedule 30.09.2019    source источник
comment
Когда вы говорите, что это не сработало, пожалуйста, укажите, почему именно   -  person Yosi Dahari    schedule 30.09.2019
comment
@YosiDahari - Спасибо за ваш комментарий. Я получаю только первое вхождение - нужна помощь в получении всех вхождений слова .   -  person Sachin Sukumaran    schedule 30.09.2019
comment
У вас есть верхняя граница количества элементов в строке?   -  person Yosi Dahari    schedule 30.09.2019
comment
как split_part, так и regexp_substr возвращаются при n-м совпадении. Не все совпадают. Чтобы получить то, что вы хотите, вам нужно ПЕРЕКРЕСТИТЬ СОЕДИНЕНИЕ с таблицей, содержащей числа 1..100 (или любое максимальное количество слов, которые вам нужно извлечь) и применить функции к каждому индексу, эффективно превращая список в несколько строк. Затем выберите нужные строки. Пример см. здесь.   -  person nimrodm    schedule 30.09.2019
comment
@YosiDahari: количество элементов в строке = 20, а количество вхождений шаблона (ABC *) может быть от 0 до 4.   -  person Sachin Sukumaran    schedule 30.09.2019


Ответы (1)


Вы получаете только одно совпадение, поскольку используемые вами функции (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