以下是 BigQuery 标准 SQL
#standardSQL
CREATE TEMP FUNCTION json2array(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS '''
return JSON.parse(input).map(x=>JSON.stringify(x));
''';
SELECT
JSON_EXTRACT_SCALAR(routes, '$.arrival_time') AS arrival_time,
JSON_EXTRACT_SCALAR(routes, '$.cut_off_date') AS cut_off_date,
JSON_EXTRACT_SCALAR(routes, '$.departure_time') AS departure_time,
JSON_EXTRACT_SCALAR(routes, '$.last_pickup_on') AS last_pickup_on,
JSON_EXTRACT_SCALAR(leg, '$.eta') eta,
JSON_EXTRACT_SCALAR(leg, '$.etd') etd,
JSON_EXTRACT_SCALAR(leg, '$.change') change
FROM `project.dataset.table`,
UNNEST(json2array(JSON_EXTRACT(routes, '$.legs'))) leg
你可以像下面的例子一样使用虚拟数据测试,玩上面的例子
#standardSQL
CREATE TEMP FUNCTION json2array(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS '''
return JSON.parse(input).map(x=>JSON.stringify(x));
''';
WITH `project.dataset.table` AS (
SELECT '''
{"legs":
[
{"eta": "2020-04-25T00:00:00.000Z", "etd": "2020-03-31T00:00:00.000Z", "change": "new"},
{"eta": "2020-04-25T00:00:00.000Z", "etd": "2020-03-31T00:00:00.000Z", "change": "new1"},
{"eta": "2020-04-25T00:00:00.000Z", "etd": "2020-03-31T00:00:00.000Z", "change": "new2"}
],
"arrival_time": "2020-04-25T00:00:00.000+00:00",
"cut_off_date": "2020-03-29",
"departure_time": "2020-03-31T00:00:00.000+00:00",
"last_pickup_on": "2020-03-29"}
''' routes
)
SELECT
JSON_EXTRACT_SCALAR(routes, '$.arrival_time') AS arrival_time,
JSON_EXTRACT_SCALAR(routes, '$.cut_off_date') AS cut_off_date,
JSON_EXTRACT_SCALAR(routes, '$.departure_time') AS departure_time,
JSON_EXTRACT_SCALAR(routes, '$.last_pickup_on') AS last_pickup_on,
JSON_EXTRACT_SCALAR(leg, '$.eta') eta,
JSON_EXTRACT_SCALAR(leg, '$.etd') etd,
JSON_EXTRACT_SCALAR(leg, '$.change') change
FROM `project.dataset.table`,
UNNEST(json2array(JSON_EXTRACT(routes, '$.legs'))) leg
下面的输出
Row arrival_time cut_off_date departure_time last_pickup_on eta etd change
1 2020-04-25T00:00:00.000+00:00 2020-03-29 2020-03-31T00:00:00.000+00:00 2020-03-29 2020-04-25T00:00:00.000Z 2020-03-31T00:00:00.000Z new
2 2020-04-25T00:00:00.000+00:00 2020-03-29 2020-03-31T00:00:00.000+00:00 2020-03-29 2020-04-25T00:00:00.000Z 2020-03-31T00:00:00.000Z new1
3 2020-04-25T00:00:00.000+00:00 2020-03-29 2020-03-31T00:00:00.000+00:00 2020-03-29 2020-04-25T00:00:00.000Z 2020-03-31T00:00:00.000Z new2
或者,如果您仍需要以 [未嵌套] JSON 形式输出,则可以使用 TO_JSON_STRING 结束查询
#standardSQL
CREATE TEMP FUNCTION json2array(input STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS '''
return JSON.parse(input).map(x=>JSON.stringify(x));
''';
SELECT TO_JSON_STRING(t) AS route
FROM (
SELECT
JSON_EXTRACT_SCALAR(routes, '$.arrival_time') AS arrival_time,
JSON_EXTRACT_SCALAR(routes, '$.cut_off_date') AS cut_off_date,
JSON_EXTRACT_SCALAR(routes, '$.departure_time') AS departure_time,
JSON_EXTRACT_SCALAR(routes, '$.last_pickup_on') AS last_pickup_on,
JSON_EXTRACT_SCALAR(leg, '$.eta') eta,
JSON_EXTRACT_SCALAR(leg, '$.etd') etd,
JSON_EXTRACT_SCALAR(leg, '$.change') change
FROM `project.dataset.table`,
UNNEST(json2array(JSON_EXTRACT(routes, '$.legs'))) leg
) t
在这种情况下,输出如下所示
Row route
1 {"arrival_time":"2020-04-25T00:00:00.000+00:00","cut_off_date":"2020-03-29","departure_time":"2020-03-31T00:00:00.000+00:00","last_pickup_on":"2020-03-29","eta":"2020-04-25T00:00:00.000Z","etd":"2020-03-31T00:00:00.000Z","change":"new"}
2 {"arrival_time":"2020-04-25T00:00:00.000+00:00","cut_off_date":"2020-03-29","departure_time":"2020-03-31T00:00:00.000+00:00","last_pickup_on":"2020-03-29","eta":"2020-04-25T00:00:00.000Z","etd":"2020-03-31T00:00:00.000Z","change":"new1"}
3 {"arrival_time":"2020-04-25T00:00:00.000+00:00","cut_off_date":"2020-03-29","departure_time":"2020-03-31T00:00:00.000+00:00","last_pickup_on":"2020-03-29","eta":"2020-04-25T00:00:00.000Z","etd":"2020-03-31T00:00:00.000Z","change":"new2"}
其中每一行都是一个 JSON,可以使用 JSON_EXTRACT_SCALAR 函数轻松地进一步查询
{
"arrival_time": "2020-04-25T00:00:00.000+00:00",
"cut_off_date": "2020-03-29",
"departure_time": "2020-03-31T00:00:00.000+00:00",
"last_pickup_on": "2020-03-29",
"eta": "2020-04-25T00:00:00.000Z",
"etd": "2020-03-31T00:00:00.000Z",
"change": "new"
}