【发布时间】:2021-03-10 22:05:46
【问题描述】:
我有一个包含 json 对象的列的表,值类型始终是字符串。
我需要两种信息:
- json 键列表
- 将json转换成键值对数组
这是我到目前为止得到的,它正在工作:
CREATE TEMP FUNCTION jsonObjectKeys(input STRING)
RETURNS Array<String>
LANGUAGE js AS """
return Object.keys(JSON.parse(input));
""";
CREATE TEMP FUNCTION jsonToKeyValueArray(input STRING)
RETURNS Array<Struct<key String, value String>>
LANGUAGE js AS """
let json = JSON.parse(input);
return Object.keys(json).map(e => {
return { "key" : e, "value" : json[e] }
});
""";
WITH input AS (
SELECT "{\"key1\": \"value1\", \"key2\": \"value2\"}" AS json_column
UNION ALL
SELECT "{\"key1\": \"value1\", \"key3\": \"value3\"}" AS json_column
UNION ALL
SELECT "{\"key5\": \"value5\"}" AS json_column
)
SELECT
json_column,
jsonObjectKeys(json_column) AS keys,
jsonToKeyValueArray(json_column) AS key_value
FROM input
问题是FUNCTION 在计算优化方面并不是最好的,所以我试图了解是否有一种方法可以使用普通 SQL 来满足这两个需求(或至少其中一个)只有 SQL 没有函数。
【问题讨论】:
标签: arrays json google-bigquery