我的数据如下所示-
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
这可行吗?
答案 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