gpt4 book ai didi

sql - 在 Postgres 中将列拆分为多行

转载 作者:行者123 更新时间:2023-11-29 11:06:45 24 4
gpt4 key购买 nike

假设我有一个这样的表:

    subject     | flag
----------------+------
this is a test | 2

subjecttext 类型,flagint 类型。我想在 Postgres 中将此表转换为类似这样的内容:

    token       | flag
----------------+------
this | 2
is | 2
a | 2
test | 2

有没有简单的方法来做到这一点?

最佳答案

在 Postgres 9.3+ 中使用 LATERAL 连接。最小形式:

SELECT token, flag
FROM tbl, unnest(string_to_array(subject, ' ')) token
WHERE flag = 2;

FROM 列表中的逗号(几乎)等同于CROSS JOINLATERAL 自动假定用于集合返回函数(SRF ) 在 FROM 列表中。为什么是“差不多”?见:

派生表的别名“token”也被假定为单个匿名列的列别名,并且我们在整个查询中假定了不同的列名。等效的,更冗长且不易出错:

SELECT s.token, t.flag
FROM tbl t
CROSS JOIN LATERAL unnest(string_to_array(subject, ' ')) AS s(token)
WHERE t.flag = 2;

或者将 SRF 移动到 SELECT 列表,这在 Postgres 中是允许的(但在标准 SQL 中是不允许的),以达到相同的效果:

SELECT unnest(string_to_array(subject, ' ')) AS token, flag
FROM tbl
WHERE flag = 2;

最后一个似乎可以接受,因为 SELECT 列表中的 SRF 已在 Postgres 10 中被清除。参见:

如果 unnest() 没有返回任何行(空或 NULL subject),(隐式)连接将从结果中删除该行。使用 LEFT JOIN ... ON true 保留来自 tbl 的符合条件的行。见:

我们也可以使用 regexp_split_to_table() ,但这通常较慢,因为正则表达式的成本更高一些。见:

关于sql - 在 Postgres 中将列拆分为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29419993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com