【发布时间】:2019-06-12 08:51:34
【问题描述】:
我想将 JSON 编码列表转换为原生 BigQuery 数组,理想情况下,这最终会是一个包含值、位置条目的元组或字典列表。因此引用了 python 枚举功能。
即
[(idx, elem) for idx, elem in enumerate(json_list_string)]
[{'pos':idx, 'value':elem} for idx, elem in enumerate(json_list_string)]
将 json 转换为数组的第一部分我已经使用 question 解决了
编辑:
WITH
my_ids AS (
SELECT 'xyz' as grp, '["7f9f98fh9g4ef393d3h5", "chg3g33f26949hg6067d", "g477e5973ec04g7c3232", "0de1ec83304d761he786", "3c1h1f153530g90g35c2", "946637g145h48322686f"]' as ids
UNION ALL
SELECT 'abc' as grp, '["7f9f98fh9g4ef393d3h5", "chg3g33fdsfsdfs49hg6067d", "g477e5973ec04g7c3232", "0de1ec83304d761he786", "3c1h1f153530g90g35c2", "946637g145h48322686f"]' as ids
)
SELECT
*
FROM my_ids
在理想的世界中,我会得到如下输出:
xyz, 7f9f98fh9g4ef393d3h5, 1
xyz, chg3g33f26949hg6067d, 2
...
abc, 946637g145h48322686f, 6
请注意,列表可能很长(最多 24 个条目,我有点不想硬编码所有路径)
Edit2:(可能的解决方案)
WITH
my_ids AS (
SELECT 'xyz' as grp, '["7f9f98fh9g4ef393d3h5", "chg3g33f26949hg6067d", "g477e5973ec04g7c3232", "0de1ec83304d761he786", "3c1h1f153530g90g35c2", "946637g145h48322686f"]' as ids
UNION ALL
SELECT 'abc' as grp, '["7f9f98fh9g4ef393d3h5", "chg3g33fdsfsdfs49hg6067d", "g477e5973ec04g7c3232", "0de1ec83304d761he786", "3c1h1f153530g90g35c2", "946637g145h48322686f"]' as ids
),
as_list AS (SELECT
*,
SPLIT(REGEXP_REPLACE(JSON_EXTRACT(ids,'$'), r'[\[\]\"]', ''), ',') AS split_items,
GENERATE_ARRAY(1, ARRAY_LENGTH(SPLIT(REGEXP_REPLACE(JSON_EXTRACT(ids,'$'), r'[\[\]\"]', ''), ','))) AS positions
FROM my_ids)
SELECT grp, ids, positions[OFFSET(off)] as pos
FROM as_list, unnest(split_items) as ids WITH OFFSET off
【问题讨论】:
-
请提供输入和所需输出的简化示例以及有关您要查找的查询类型的更多详细信息
-
@MikhailBerlyant 已更新,是否更清楚?
-
只需发布您的解决方案作为答案!或者它仍然不是你想要的?
-
@MikhailBerlyant 是的,我想我会这样做。想知道是否有更自然的方式来实现我想要的。这感觉有点难看:D
-
我可以看到另一个不那么冗长的选项 - 将很快发布...发布!
标签: google-bigquery