json - 将多种数据类型的数组拆分为不同的数组
问题描述
我在 postgres 数据库中有可用的数据,我需要在这些数据库上运行 BI 工具来获取一些聚合信息。不幸的是,数据以最奇怪的方式结构化。我有示例 json 列可以使用:
{"products": ["345661C1-2665-4870-9649-803B20A4B579", 1, "FE719978-253F-4763-B1B7-648B9988C5BF", 2, "F66FE491-AC06-49DD-987B-0B88CB49CEB7", 2, "5628A5A4-6030-459D-96F3-32D3C04B7F80", 3, "2B8DAE11-5D60-4DB7-901B-0CCBA7D9418C", 1]}
我确实意识到 products 数组本身不是正确的 postgres 语法,字符串文字也不是。
理想情况下,我有一个查询导致:
产品 | 数量 |
---|---|
345661C1-2665-4870-9649-803B20A4B579 | 1 |
FE719978-253F-4763-B1B7-648B9988C5BF | 2 |
F66FE491-AC06-49DD-987B-0B88CB49CEB7 | 2 |
5628A5A4-6030-459D-96F3-32D3C04B7F80 | 3 |
2B8DAE11-5D60-4DB7-901B-0CCBA7D9418C | 1 |
这对postgres可行吗?我在寻找
- 根据数据类型拆分数组的函数
- 基于奇数/偶数索引删除元素的函数
我总是会寻找带有代码的解决方案,但 BI 工具是该数据库唯一列入白名单的工具
解决方案
这感觉有点骇人听闻(如果您的数组不是“键/值”列表格式,则会失败),但您可以使用它WITH ORDINALITY
来跟踪每个元素的索引并分组ordinality / 2
(将连续的元素重新组合在一起):
架构 (PostgreSQL v13)
查询 #1
WITH data(arr) AS (
VALUES (ARRAY['345661C1-2665-4870-9649-803B20A4B579', '1', 'FE719978-253F-4763-B1B7-648B9988C5BF', '2', 'F66FE491-AC06-49DD-987B-0B88CB49CEB7', '2', '5628A5A4-6030-459D-96F3-32D3C04B7F80', '3', '2B8DAE11-5D60-4DB7-901B-0CCBA7D9418C', '1'])
)
SELECT (ARRAY_AGG(unnest ORDER BY ordinality))[1] AS product, (ARRAY_AGG(unnest ORDER BY ordinality))[2] AS amount
FROM data
CROSS JOIN LATERAL UNNEST(arr) WITH ORDINALITY
GROUP BY (ordinality-1) / 2; /* ordinality is 1-based, hence the -1 */
产品 | 数量 |
---|---|
345661C1-2665-4870-9649-803B20A4B579 | 1 |
FE719978-253F-4763-B1B7-648B9988C5BF | 2 |
F66FE491-AC06-49DD-987B-0B88CB49CEB7 | 2 |
5628A5A4-6030-459D-96F3-32D3C04B7F80 | 3 |
2B8DAE11-5D60-4DB7-901B-0CCBA7D9418C | 1 |
推荐阅读
- python - 为什么 python kivy,图形可调整宽度和高度不起作用
- javascript - 使用函数在地图中返回值?
- c++ - 生成随机比率
- webpack - 编辑我的 reactjs webpack 配置文件时出现“语法错误:意外的严格模式保留字”
- python - 如何将函数作为数组元素传递
- javascript - Canvas setTransform() 剪切图像
- asp.net - 如何将简单的 Dotnet 应用程序发布到 Ubuntu?
- php - 如何读取上传到数据库的 PDF 中的表格并显示在 PHP 网页上
- php - 为什么我的函数没有返回任何内容
- javascript - 类公共实例字段