sql - BigQuery 查询嵌套的 json

标签 sql json nested google-bigquery

我有以字符串形式保存在 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/

相关文章:

meteor 铁路由器嵌套路由

java - java.net.URL 如何打开连接?它使用 socket 吗?

java - "Content is not allowed in prolog"使用 JAXB 解码 JSON 时

java - 显示带有嵌套 for 循环的 ASCII 菱形

java - 如何向嵌套 HashMap 中插入记录?

json - 如何解决错误 : "Invalid type in JSON write (NSConcreteData)"

sql - 如何在 PostgreSQL 的函数内返回 SELECT 的结果?

mysql - SELECT 列表不在 GROUP BY 子句中并且包含非聚合列

mysql - 为什么 ifnull() 在 MariaDB 10.1+ 中返回 DECIMAL 而不是 BIGINT?

sql - oracle SQL字符串中ASCII 255的含义