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

PostgreSQL 8中如何选择性拼接符合条件的SQL列名?

选择性拼接布尔值为True的列名(PostgreSQL 8优先)

PostgreSQL 8 解决方案

针对包含id、column1、column2、column3(后三列为布尔类型)的表,可利用concat_ws函数结合条件判断实现需求:

SELECT
  id,
  concat_ws(',',
    CASE WHEN column1 THEN 'column1' END,
    CASE WHEN column2 THEN 'column2' END,
    CASE WHEN column3 THEN 'column3' END
  ) AS true_columns
FROM your_table;

逻辑说明

  • concat_ws函数会以指定分隔符(此处为逗号)拼接所有非NULL参数,自动忽略NULL值
  • 每个CASE语句仅在对应列值为true时返回列名字符串,否则返回NULL,从而只保留需要的列名进行拼接

PostgreSQL 9.3+ 简化方案(可选)

如果使用更高版本的PostgreSQL,可借助JSON函数动态处理,避免手动编写多个CASE:

SELECT
  id,
  string_agg(key, ',') AS true_columns
FROM your_table,
  json_each_text(row_to_json(your_table) - 'id') AS j(key, value)
WHERE value = 'true'
GROUP BY id;

逻辑说明

  • row_to_json将行数据转换为JSON对象,- 'id'移除不需要的id字段
  • json_each_text将JSON对象拆分为键值对行,过滤出值为'true'的行后,用string_agg拼接列名(key)

其他SQL语法转换为PostgreSQL示例

以MySQL为例,原语法可直接转换为PostgreSQL 8兼容写法:

-- MySQL 5.0+ 原写法
SELECT
  id,
  CONCAT_WS(',',
    IF(column1, 'column1', NULL),
    IF(column2, 'column2', NULL),
    IF(column3, 'column3', NULL)
  ) AS true_columns
FROM your_table;

转换为PostgreSQL语法时,仅需将IF替换为CASE WHEN ... THEN ... END即可,与前文PostgreSQL 8方案完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:30:58