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

PostgreSQL 12.8 行转列需求:将变量名转为列头并整合多类型字段值

PostgreSQL 12.8 行转列需求:将变量名转为列头并整合多类型字段值

Hi Victor,我来帮你搞定这个Camunda变量表的行转列问题~

你之前的尝试思路其实方向是对的,但差了关键一步聚合——因为你的表中每个流程实例的每个变量都是单独一行,直接用CASE WHEN会生成多行为null的记录,需要通过聚合函数把同一实例的变量值合并到同一行里。

针对你的需求的解决方案

这里用MAX()聚合函数配合CASE WHEN,就能把同一proc_inst_id_下的不同变量值整合到一行,同时对应到正确的列:

SELECT
  v.proc_inst_id_ AS id_,
  -- 针对offShoreOnly变量,取long_字段的值
  MAX(CASE WHEN v.name_ = 'offShoreOnly' THEN v.long_ END) AS "offshoreOnly",
  -- 针对dueDate变量,取long_字段的值
  MAX(CASE WHEN v.name_ = 'dueDate' THEN v.long_ END) AS "dueDate"
FROM camunda_data.act_ru_variable v
WHERE 
  v.proc_def_id_ NOT ILIKE 'StartProcess%'
  AND v.name_ IN ('dueDate', 'offShoreOnly')
GROUP BY v.proc_inst_id_;

为什么这样能行?

  • CASE WHEN会为每个变量筛选出对应字段的值,其他行则返回null
  • MAX()函数会自动忽略null值,只保留每个proc_inst_id_下该变量的有效数值
  • GROUP BY proc_inst_id_确保最终结果中每个流程实例只占一行

扩展支持多类型变量

如果还有其他类型的变量(比如appealDto存在text_字段里),只需要扩展CASE WHEN的分支即可:

SELECT
  v.proc_inst_id_ AS id_,
  MAX(CASE WHEN v.name_ = 'offShoreOnly' THEN v.long_ END) AS "offshoreOnly",
  MAX(CASE WHEN v.name_ = 'dueDate' THEN v.long_ END) AS "dueDate",
  -- 针对text类型的变量,取text_字段的值
  MAX(CASE WHEN v.name_ = 'appealDto' THEN v.text_ END) AS "appealDto"
FROM camunda_data.act_ru_variable v
WHERE 
  v.proc_def_id_ NOT ILIKE 'StartProcess%'
  AND v.name_ IN ('dueDate', 'offShoreOnly', 'appealDto')
GROUP BY v.proc_inst_id_;

额外小技巧

如果需要把所有值统一转成文本类型方便展示,可以在CASE WHEN里加类型转换:

MAX(CASE WHEN v.name_ = 'offShoreOnly' THEN v.long_::TEXT END) AS "offshoreOnly"

备注:内容来源于stack exchange,提问作者VictorGram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 13:29:31