从 JSON 时动态生成 Bigquery 案例
Dynamically generate Bigquery case when from JSON
我在 Bigquery 中有一个数据集,其中一个字段是 json,我想从该 json 创建一个 table 指标变量。我希望使用如下语句的 case when
SELECT id,
-- SELECT JSON EXTRACT_
-- UNNEST(JSON_EXTRACT(column,
-- "$.rules[0].group"))
CASE WHEN
JSON_EXTRACT_SCALAR(column, '$.rules[0].group') = "interests" OR
JSON_EXTRACT_SCALAR(column, '$.rules[1].group') = "interests" OR
JSON_EXTRACT_SCALAR(column, '$.rules[2].group') = “interests" OR
JSON_EXTRACT_SCALAR(column, '$.rules[3].group') = "interests" OR
JSON_EXTRACT_SCALAR(column, '$.rules[4].group') = "interests" OR
JSON_EXTRACT_SCALAR(column, '$.rules[5].group') = "interests"
THEN 1
ELSE 0
END indicator_name
FROM
table
但是,此查询仅适用于规则列表中有 6 个元素的行。规则列表的长度是可变的。此外,除了兴趣之外,我还想为几个不同的 'groups' 执行此操作,以便我 return 一个 table 的 ID 和几个指示变量列。
一行 json 的示例:
{"rules":[{"group":"age","key":"age","value":"13-17","operator":"equals"},{"group":"gender","key":"gender","value":"female","operator":"equals"},{"group":"interests","key":"interest","value":"xy_44","operator":"contains"},{"group":"geog","key":"geog","value":"US/","operator":"starts_with"},{"group":"o_version","key":"o_version","value":"ghybu","operator":"starts_with"},{"group":"o_version_min_group","key":"o_version","value":"36573232","operator":"greater_than_or_equals"}],"inventory":{"include":{"bundles":["mpp"]}}
此查询的脚本运行使用了 jinja,因此如果有帮助可以使用它。
考虑以下方法
SELECT id,
IF((
SELECT LOGICAL_OR(JSON_EXTRACT_SCALAR(rule, '$.group') = 'interests')
FROM UNNEST(JSON_EXTRACT_ARRAY(column, '$.rules')) rule
), 1, 0) indicator_name
FROM `project.dataset.table`
我在 Bigquery 中有一个数据集,其中一个字段是 json,我想从该 json 创建一个 table 指标变量。我希望使用如下语句的 case when
SELECT id,
-- SELECT JSON EXTRACT_
-- UNNEST(JSON_EXTRACT(column,
-- "$.rules[0].group"))
CASE WHEN
JSON_EXTRACT_SCALAR(column, '$.rules[0].group') = "interests" OR
JSON_EXTRACT_SCALAR(column, '$.rules[1].group') = "interests" OR
JSON_EXTRACT_SCALAR(column, '$.rules[2].group') = “interests" OR
JSON_EXTRACT_SCALAR(column, '$.rules[3].group') = "interests" OR
JSON_EXTRACT_SCALAR(column, '$.rules[4].group') = "interests" OR
JSON_EXTRACT_SCALAR(column, '$.rules[5].group') = "interests"
THEN 1
ELSE 0
END indicator_name
FROM
table
但是,此查询仅适用于规则列表中有 6 个元素的行。规则列表的长度是可变的。此外,除了兴趣之外,我还想为几个不同的 'groups' 执行此操作,以便我 return 一个 table 的 ID 和几个指示变量列。
一行 json 的示例:
{"rules":[{"group":"age","key":"age","value":"13-17","operator":"equals"},{"group":"gender","key":"gender","value":"female","operator":"equals"},{"group":"interests","key":"interest","value":"xy_44","operator":"contains"},{"group":"geog","key":"geog","value":"US/","operator":"starts_with"},{"group":"o_version","key":"o_version","value":"ghybu","operator":"starts_with"},{"group":"o_version_min_group","key":"o_version","value":"36573232","operator":"greater_than_or_equals"}],"inventory":{"include":{"bundles":["mpp"]}}
此查询的脚本运行使用了 jinja,因此如果有帮助可以使用它。
考虑以下方法
SELECT id,
IF((
SELECT LOGICAL_OR(JSON_EXTRACT_SCALAR(rule, '$.group') = 'interests')
FROM UNNEST(JSON_EXTRACT_ARRAY(column, '$.rules')) rule
), 1, 0) indicator_name
FROM `project.dataset.table`