从列中提取数据

时间:2020-04-28 19:30:18

标签: sql google-bigquery

我的数据如下所示-

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

我想提取方括号(值)中的UNIQUE数字。以下是我尝试过的-

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 个答案:

答案 0 :(得分:2)

您应使用以下正则表达式

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