我的客戶將 GCP BigQuery 服務中的資料存盤為表,其中包含名為people的列,型別字串包含JSON資料
一部分資料如下所示:
{
"id": "someid",
"data": [
{
"key": "country",
"valueString": "USA"
},
{
"key": "name",
"valueString": "Peter"
}
]
}
另一個:
{
"id": "someid",
"data": [
{
"key": "age",
"valueString": "23"
},
{
"key": "country",
"valueString": "France"
},
{
"key": "name",
"valueString": "Peter"
}
]
}
我想創建一個查詢,可以找到 key="country" 的所有值:
country|
-------|
USA |
-------|
France |
-------|
USA |
-------|
.......|
在我看來,我需要使用 JSONPath 查詢語言。我的初始版本是:
SELECT JSON_EXTRACT_SCALAR(people, "$.data[0].valueString") AS country
FROM table_name
但這并不能解決問題,因為這個欄位可以存盤 0, 1,... n 個元素。
uj5u.com熱心網友回復:
考慮下面[超級]簡單的方法
select json_extract_scalar(json, '$.valueString') as country
from your_table, unnest(json_extract_array(people, '$.data')) json
where json_extract_scalar(json, '$.key') = 'country'
如果應用于您問題中的樣本資料 - 輸出是

uj5u.com熱心網友回復:
您可以使用 json_query_array 和 unnest 來實作這一點
with j1 as (
select 1 id, '{ "id": "someid", "data": [ { "key": "country", "valueString": "USA" }, { "key": "name", "valueString": "Peter" } ]}' as j
union all
select 2 ,'{ "id": "someid", "data": [ { "key": "age", "valueString": "23" }, { "key": "country", "valueString": "Germany" }, { "key": "name", "valueString": "Peter" } ]}'
),
j2 as (
select
j1.id,
JSON_EXTRACT_SCALAR(jj,'$.key') key,
JSON_EXTRACT_SCALAR(jj,'$.valueString') value
from j1,unnest(json_query_array(j, '$.data')) as jj
)
select id,value country from j2 where key='country'
uj5u.com熱心網友回復:
我不知道 BigQuery,但如果它需要標準 JSONPath,那么試試
SELECT JSON_EXTRACT_SCALAR(people, "$.data[?(@.key == 'country')].valueString") AS country FROM table_name
這應該為您提供 key == "country" 的每個資料項的 valueString。
https://github.com/json-path/JsonPath#path-examples
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/422885.html
標籤:
下一篇:無法在React.JS中呈現陣列
