You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中将列标题转为列值并对应另一列数据?

在PostgreSQL中将宽表转换为长表(行转列)

针对你需要将online-websites表的列转换为行的需求,以下是几种在PostgreSQL中可行的实现方式:

方法1:使用UNNEST结合数组(简洁高效)

这种方法通过将网站名和对应次数分别放入数组,再用UNNEST同时展开两个数组,实现列到行的转换:

SELECT
    UNNEST(ARRAY['Amazon', 'Flipkart', 'Myntra']) AS "Website name",
    UNNEST(ARRAY[Amazon, Flipkart, Myntra]) AS "Count"
FROM "online-websites";

说明:UNNEST会按顺序匹配两个数组的元素,确保网站名和对应的次数一一对应,适合列数固定的场景。

方法2:使用UNION ALL(直观易读)

如果表的列数不多,直接用UNION ALL拼接每个列的查询结果也是很直观的选择:

SELECT 'Amazon' AS "Website name", Amazon AS "Count" FROM "online-websites"
UNION ALL
SELECT 'Flipkart' AS "Website name", Flipkart AS "Count" FROM "online-websites"
UNION ALL
SELECT 'Myntra' AS "Website name", Myntra AS "Count" FROM "online-websites";

说明:这种写法清晰易懂,但当列数较多时,代码会变得冗长。

方法3:使用jsonb_each_text(动态适配列变化)

如果后续可能新增网站列,不想每次修改SQL,可以利用PostgreSQL的JSON函数动态处理所有列:

SELECT
    key AS "Website name",
    value::integer AS "Count"
FROM "online-websites",
     jsonb_each_text(to_jsonb("online-websites"));

说明:

  • to_jsonb("online-websites")将每行数据转换为JSONB对象,列名作为键,列值作为值
  • jsonb_each_text将JSONB对象拆分为键值对行
  • 最后将value转换为整数类型(匹配原表存储的次数数值类型)

注意事项

  • 由于表名online-websites包含连字符,SQL中需要用双引号包裹表名和列名
  • 如果原表有多行数据,以上方法都会自动处理每行的转换,生成对应的多行结果

内容的提问来源于stack exchange,提问作者Praneetha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:54:22