Я не смог выяснить, как это сделать в стандарте SQL
Ниже приведено описание стандарта BigQuery SQL, и все это делается одним выстрелом - всего один [простой ] запрос
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'A quick brown fox jumps over the lazy dog' text
), list AS (
SELECT ['quick brown fox', 'fox jumps'] phrases
)
SELECT text AS original_text, REGEXP_REPLACE(text, STRING_AGG(pattern, '|'), '') processed_text FROM (
SELECT DISTINCT text, SUBSTR(text, MIN(start), MAX(finish) - MIN(start) + 1) pattern FROM (
SELECT *, COUNTIF(flag) OVER(PARTITION BY text ORDER BY start) grp FROM (
SELECT *, start > LAG(finish) OVER(PARTITION BY text ORDER BY start) flag FROM (
SELECT *, start + phrase_len - 1 AS finish FROM (
SELECT *, LENGTH(cut) + 1 + OFFSET * phrase_len + IFNULL(SUM(LENGTH(cut)) OVER(win), 0) start
FROM `project.dataset.table`, list,
UNNEST(phrases) phrase,
UNNEST([LENGTH(phrase)]) phrase_len,
UNNEST(REGEXP_EXTRACT_ALL(text, r'(.+?)' || phrase)) cut WITH OFFSET
WINDOW win AS (PARTITION BY text, phrase ORDER BY OFFSET ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
)))) GROUP BY text, grp
) GROUP BY text
с выводом
Row original_text processed_text
1 A quick brown fox jumps over the lazy dog A over the lazy dog
Я тестировал выше с несколькими более сложными / хитрыми текстами, и он все еще работал
Краткое объяснение:
- собирает все включения фраз в список и их соответствующие начала и конца
- объединяет перекрывающиеся фрагменты и вычисляет их соответствующие начала и конца
- извлекает новые фрагменты, основываясь на начале и конце указанного выше шага 2
- упорядочьте DES C их по длине и сгенерируйте выражение регулярного выражения
- наконец выполните REGEXP_REPLACE, используя регулярное выражение, сгенерированное на шаге 4 выше
Выше может выглядеть грязно - но на самом деле все это делается в одном запросе и в чистом виде SQL