我有以字符串形式保存在 BigQuery 中的 JSON 数据。
{
"event":{
"action":"prohibitedSoftwareCheckResult",
"clientTime":"2017-07-16T12:55:40.828Z",
"clientTimeZone":"3",
"serverTime":"2017-07-16T12:55:39.000Z",
"processList":{
"1":"outlook.exe",
"2":"notepad.exe"
}
},
"user":{
"id":123456,
}
}
我想要一个结果集,其中每个进程都在不同的行中。 像这样的东西:
UserID ProcessName
-------------------------
123456 outlook.exe
123456 notepad.exe
我看到有一个选项可以查询重复数据,但根据我的理解,该字段需要是 RECORD 类型。
是否可以在子查询中“即时”转换为 RECORD 类型? (我无法将源字段更改为 RECORD)。
或者,是否有不同的方法来返回所需的结果集?
最佳答案
这可能是您的解决方法:
SELECT
user_id,
processListValues
FROM(
SELECT
JSON_EXTRACT_SCALAR(json_data, '$.user.id') user_id,
REGEXP_EXTRACT_ALL(JSON_EXTRACT(json_data, '$.event.processList'), r':"([a-zA-Z0-9\.]+)"') processListValues
FROM data
),
UNNEST(processListValues) processListValues
以您的 JSON 为例:
WITH data AS(
SELECT """{
"event":{
"action":"prohibitedSoftwareCheckResult",
"clientTime":"2017-07-16T12:55:40.828Z",
"clientTimeZone":"3",
"serverTime":"2017-07-16T12:55:39.000Z",
"processList":{
"1":"outlook.exe",
"2":"notepad.exe",
"3":"outlo3245345okexe"
}
},
"user":{
"id":123456,
}
}""" as json_data
)
SELECT
user_id,
processListValues
FROM(
SELECT
JSON_EXTRACT_SCALAR(json_data, '$.user.id') user_id,
REGEXP_EXTRACT_ALL(JSON_EXTRACT(json_data, '$.event.processList'), r':"([a-zA-Z0-9\.]+)"') processListValues
FROM data
),
UNNEST(processListValues) processListValues
结果:
Row user_id processListValues
1 123456 outlook.exe
2 123456 notepad.exe
3 123456 outlo3245345okexe
关于sql - BigQuery 查询嵌套的 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45585201/