2016-05-08 3 views
0

В Big Query, когда я выполняю поиск по регулярному выражению, он возвращает только первое совпадение/вхождение.BigQuery возвращает все совпадения регулярного выражения

Есть ли способ вернуть все совпадения, объединенные? что-то вроде GROUP_CONCAT может быть?

REGEXP_EXTRACT(body, r"(\w+)")

ответ

2

В стандартном SQL, который был недавно представил при поддержке BigQuery - вы можете попробовать, как показано ниже

SELECT 
    body, 
    (SELECT STRING_AGG(word) FROM words.word) AS words 
FROM (
    SELECT 
    body, REGEXP_EXTRACT_ALL(body, r'(\w+)') AS word 
    FROM (
    SELECT 'abc xyz qwerty asd' AS body UNION ALL 
    SELECT 'zxc dfg 345' AS body 
) 
) words 

Не забудьте снимите флажок Use Legacy SQL под Show Options
Подробнее подробнее об REGEXP_EXTRACT_ALL и STRING_AGG


Если вы застряли с тем, что теперь в BigQuery называется устаревшую SQL - вы можете попробовать что-то вроде ниже

SELECT 
    body, 
    GROUP_CONCAT(SPLIT(body, ' ')) AS words 
FROM 
    (SELECT 'abc xyz qwerty asd' AS body), 
    (SELECT 'zxc dfg 345' AS body) 

Я понимаю, что это не обязательно именно то, что вам нужно - но может помочь


Другой подход с унаследованным SQL-кодом BigQuery, который больше подходит для случаев, когда вам нужно использовать регулярное выражение.
Например - предположим, что вам нужно извлечь только цифры от тела Идея заключается в нюк ничего, кроме цифр от тела с помощью REGEXP_REPLACE, а затем применить описанный выше SPLIT() + GROUP_CONCAT()

SELECT 
    body, 
    GROUP_CONCAT(SPLIT(REGEXP_REPLACE(body, r'(\D)+', ':'), ':')) AS words 
FROM 
    (SELECT 'abc 123 xyz 543 qwerty asd' AS body), 
    (SELECT '987zxc 123 dfg 345' AS body) 
Смежные вопросы