如何在标准 SQL BigQuery 中解析 JSON?

GRS*_*GRS 4 sql json google-bigquery

在将一些 json 数据流式传输到 BQ 后,我们有一个如下所示的记录:

"{\"Type\": \"Some_type\", \"Identification\": {\"Name\": \"First Last\"}}"
Run Code Online (Sandbox Code Playgroud)

我将如何从中提取type?例如,我想得到Some_type.

我尝试了https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions 中显示的所有可能的组合,但没有成功,即,我想:

SELECT JSON_EXTRACT_SCALAR(raw_json , "$[\"Type\"]") as parsed_type FROM `table` LIMIT 1000 
Run Code Online (Sandbox Code Playgroud)

是我需要的。但是,我得到:

JSONPath 中的无效令牌位于:["Type"]

行预览图片

在此处输入图片说明

Mik*_*ant 7

以下示例适用于 BigQuery 标准 SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, "{\"Type\": \"Some_type\", \"Identification\": {\"Name\": \"First Last\"}}" raw_json UNION ALL
  SELECT 2, '{"Type": "Some_type", "Identification": {"Name": "First Last"}}'
)
SELECT id, JSON_EXTRACT_SCALAR(raw_json , "$.Type") AS parsed_type
FROM `project.dataset.table`  
Run Code Online (Sandbox Code Playgroud)

结果

Row id  parsed_type  
1   1   Some_type    
2   2   Some_type    
Run Code Online (Sandbox Code Playgroud)

请参阅下面的更新示例 - 看看我认为模仿您的情况的第三条记录

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, "{\"Type\": \"Some_type\", \"Identification\": {\"Name\": \"First Last\"}}" raw_json UNION ALL
  SELECT 2, '''{"Type": "Some_type", "Identification": {"Name": "First Last"}}''' UNION ALL
  SELECT 3, '''"{\"Type\": \"


                     null1\"}"
  '''
)
SELECT id, 
  JSON_EXTRACT_SCALAR(REGEXP_REPLACE(raw_json, r'^"|"$', '') , "$.Type") AS parsed_type
FROM `project.dataset.table`  
Run Code Online (Sandbox Code Playgroud)

结果

Row id  parsed_type  
1   1   Some_type    
2   2   Some_type    
3   3   null1    
Run Code Online (Sandbox Code Playgroud)

注意:我使用null1而不是null这样你可以很容易地看到它不是一个NULL而是字符串null1