我开始在google bigquery中使用json列。
我的目标是实现一个查询:根据路径提取json对象中的给定值,并返回其真实的SQL值。
示例:给定{"foo": {"bar": 123}}
,我想得到$.foo.bar
的整数值。但是,当查询包含json列的表时,我得到了一个字符串。
我知道这种行为是有据可查的
我正在寻找一个片段/配方/一种方法来实现一些东西,可以为我做标量转换。
我得到了一些不是有效的SQL,但代表我搜索的东西:
WITH
base AS (
SELECT
JSON_QUERY( JSON '{"foo": {"unknown":123}}', '$.foo') AS col)
SELECT
CASE JSON_TYPE(JSON_QUERY(col, '$.unknown'))
WHEN 'null' THEN NULL
WHEN 'number' THEN LAX_FLOAT64(JSON_QUERY(col, '$.unknown'))
WHEN 'boolean' THEN LAX_BOOL(JSON_QUERY(col, '$.unknown'))
WHEN 'string' THEN LAX_STRING(JSON_QUERY(col, '$.unknown'))
ELSE
-- array or map are not scalar - keep them as they are:
JSON_QUERY(col, '$.unknown')
END as output
FROM
base
字符串
任何帮助是高度赞赏!谢谢:)
2条答案
按热度按时间yduiuuwa1#
字符串
此查询使用JSON_EXTRACT函数提取值,然后使用CASE语句检查JSON类型并执行适当的转换。
确保将基本CTE中的示例JSON字符串替换为实际的列引用。
gc0ot86w2#
查询:
在查询
output
列expecting中只有一种数据类型,因此您可以考虑以下查询,而不是创建一个列:字符串
结果:
的数据
从上面的结果中,你可以选择不包含null值的列。例如,如果你的输入值是number,那么列stringcolumn和boolcolumn的值都是null。使用子查询而不是选择所有列,你可以选择intcolumn列。
根据我的理解,没有内置的BigQuery函数可以根据路径在json对象中提取一个精确的给定值并返回其真实的SQL值。所以如果你想在BigQuery中使用这个功能,你可以在Issue Tracker中提出一个功能请求。
有关更多信息,您可以参考这些link1,link2和link3。