PostgreSQL动态列展示数据求助:crosstab函数无法实现需求
解决PostgreSQL单列两行数据转键值对格式问题
场景说明
假设你的表(比如名为your_table)仅有Data_Column一列,两行数据分别是列名和对应值,示例如下:
| Data_Column |
|---|
| user_id |
| 1001 |
需要输出格式:user_id: 1001
解决方案
无需使用crosstab(该函数更适合多组键值对转宽表场景),直接通过行号关联两行数据即可:
SELECT CONCAT(t1.data_column, ': ', t2.data_column) AS key_value_pair FROM ( -- 给每行标记行号 SELECT data_column, ROW_NUMBER() OVER () AS row_num FROM your_table ) t1 -- 关联第一行(列名)和第二行(值) JOIN ( SELECT data_column, ROW_NUMBER() OVER () AS row_num FROM your_table ) t2 ON t1.row_num = 1 AND t2.row_num = 2;
扩展:处理多组成对行
如果你的Data_Column中有多组成对的列名和值(比如4行:name、alice、age、30),可以按组关联:
SELECT CONCAT(t1.data_column, ': ', t2.data_column) AS key_value_pair FROM ( SELECT data_column, -- 每两行分为一组 CEIL(ROW_NUMBER() OVER () / 2.0) AS group_id, -- 标记是组内的列名行(1)还是值行(2) MOD(ROW_NUMBER() OVER (), 2) + 1 AS row_type FROM your_table ) t1 JOIN ( SELECT data_column, CEIL(ROW_NUMBER() OVER () / 2.0) AS group_id, MOD(ROW_NUMBER() OVER (), 2) + 1 AS row_type FROM your_table ) t2 ON t1.group_id = t2.group_id AND t1.row_type = 1 -- 匹配组内的列名行 AND t2.row_type = 2; -- 匹配组内的值行
内容的提问来源于stack exchange,提问作者World of Titans
相关产品推荐
相关产品推荐

