如何将带有数组的普通值转换为 PostgreSQL 中的数据结构?

Posted

技术标签:

【中文标题】如何将带有数组的普通值转换为 PostgreSQL 中的数据结构?【英文标题】:How to convert plain values with arrays into a data structure in PostgreSQL? 【发布时间】:2021-08-15 11:53:25 【问题描述】:

我有这个从“作者 + 文章”值列表开始的演示查询:

VALUES
('author1', ARRAY[('title1', 'content1'), ('title2', 'content2')]),
('author2', ARRAY[('title3', 'content3'), ('title4', 'content4')])

我想把它转换成下面的数据结构:

author title content
author1 title1  content1
author1  title2 content2
author2 title3  content3
author2 title4  content4

我已经走到这一步了:

WITH "raw_data" ("author", "articles") AS  (
    VALUES
        ('author1', ARRAY[('title1', 'content1'), ('title2', 'content2')]),
        ('author2', ARRAY[('title3', 'content3'), ('title4', 'content4')])
),
"articles" AS (
    SELECT "author", unnest("articles") AS "article" FROM "raw_data"
)
SELECT author, article FROM "articles";

但我得到以下信息:

author article
author1 (title1, content1)
author1  (title2, content2)
author2 (title3, content3)
author2 (title4, content4)

我需要找到一种方法将记录 (title2, content1) 转换为 2 个不同的列。

谢谢大家!

【问题讨论】:

【参考方案1】:

您可以通过为您的记录创建自定义类型并将其转换为它来实现此目的。

见下例

架构 (PostgreSQL v13)


查询 #1

create type article as (title text, contents text);

没有要显示的结果。


查询 #2

WITH "raw_data" ("author", "articles") AS  (
    VALUES
        ('author1', ARRAY[('title1', 'content1'), ('title2', 'content2')]),
        ('author2', ARRAY[('title3', 'content3'), ('title4', 'content4')])
),
"articles"  AS (
    SELECT "author", ((unnest("articles"))::text::article).* FROM "raw_data"
)
SELECT * FROM "articles";
author title contents
author1 title1 content1
author1 title2 content2
author2 title3 content3
author2 title4 content4

View on DB Fiddle

只是分解表达式((unnest("articles"))::text::article).*

    (unnest("articles") - 将您的数组转换为行 ((unnest("articles"))::text - 将每条记录转换为文本(目前无法直接转换为文章) (unnest("articles"))::text::article - 将每条记录转换为您的文章类型 ((unnest("articles"))::text::article).* - 从您的记录中展开或全选以获取两列

让我知道这是否适合你

【讨论】:

跟进问题@ggordon:您知道如何从单个 JSON 文档开始获得类似的结果吗? (我正在准备关于 PostgreSQL 的 JSON 讲座,并且我正在整理一些通常被忽视的用例,以支持多个查询和应用程序逻辑) 您可以使用一些示例数据和预期结果创建另一个问题,并在此处分享链接,以便我和其他 S/O 用户可以查看 顺便说一句,感谢您的帮助,这是最终的教程:github.com/marcopeg/amazing-postgresql/tree/main/projects/…

以上是关于如何将带有数组的普通值转换为 PostgreSQL 中的数据结构?的主要内容,如果未能解决你的问题,请参考以下文章

函数如何将数组或设置值作为 PostgreSQL 中用户定义函数的参数 (IN)

将 Json 转换为 XML - 带有数组值的 Json

如何将包含单引号和双引号值的 Python 列表转换为所有双引号值

如何将普通的 JS 数组转换为 JSON 对象

PostgreSQL 和 JDBC 使用 setArray 设置整数数组抛出异常“无法将类型整数 [] 转换为整数”

如何将带有“(ISO-8859-1)字符的字符串转换为普通(UTF-8)字符?