Извлечение данных из столбца - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть данные, которые выглядят следующим образом:

id            a_json
111       {key:A,values:[123,2345,2345,456,78,9]}
222       {key:A,values:[1112, 323, 11, 11]}

Я хочу извлечь уникальные числа в квадратных скобках (значения). Вот что я пробовал -

SELECT
  id,
  REGEXP_EXTRACT_ALL(a_json, r'([0-9]+)*(,[0-9]+)*'),
  a_json
FROM 
`project.dataset.table`
WHERE
  a_json like  "%values%"
GROUP BY
  id,
  a_json

Но это дает мне следующую ошибку:

Regular expression passed to REGEXP_EXTRACT_ALL must not have more than 1 capturing group

Я хочу, чтобы результат выглядел как -

id            a_json                                  numbers
111       {key:A,values:[123,2345,2345,456,78,9]}   123,2345,456,78,9
222       {key:A,values:[1112,323,11,11]}           1112,323,11

это выполнимо?

1 Ответ

2 голосов
/ 28 апреля 2020

Вы должны использовать ниже регулярное выражение

REGEXP_EXTRACT_ALL(a_json, r'\d+') as numbers  

, в этом случае вывод будет

Row id  a_json                              numbers  
1   111 {key:A,values:[123,2345,456,78,9]}  123  
                                            2345     
                                            456  
                                            78   
                                            9    
2   222 {key:A,values:[1112, 323, 11]}      1112     
                                            323  
                                            11     

В качестве альтернативы - вы можете использовать версию ниже - в этом случае вы можете опустить WHERE a_json like "%values%"

SPLIT(REGEXP_EXTRACT(a_json, r'values:\[(.*)]')) numbers    

с точно таким же выводом

Я хочу увидеть результат в формате через запятую. Кроме того, я забыл упомянуть в вопросе, что мне нужно проверять уникальные значения при этом.

Ниже простых настроек можно сделать трюк

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 111 id, '{key:A,values:[123,2345,2345,456,78,9]}' a_json UNION ALL
  SELECT 222, '{key:A,values:[1112, 323, 11, 11]}' 
)
SELECT id, a_json,
  (SELECT STRING_AGG(DISTINCT number) FROM UNNEST(SPLIT(REGEXP_EXTRACT(a_json, r'values:\[(.*)]'))) number) numbers
FROM `project.dataset.table`   

с выводом

Row id      a_json                                      numbers  
1   111     {key:A,values:[123,2345,2345,456,78,9]}     123,2345,456,78,9    
2   222     {key:A,values:[1112, 323, 11, 11]}          1112, 323, 11   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...