PostgreSQL中如何根据数据值查询对应列名
在PostgreSQL中根据数据值查询对应的列名
嗨,针对你要找出每行中值为1的列名的需求,这里给你两个实用的解决办法,你可以根据自己的场景选择:
场景1:每行只有一个值为1的列(和你的示例数据一致)
这种情况用CASE表达式最直接,写起来简单易懂,运行效率也高:
SELECT id, CASE WHEN serv1 = 1 THEN 'serv1' WHEN serv2 = 1 THEN 'serv2' WHEN serv3 = 1 THEN 'serv3' WHEN serv4 = 1 THEN 'serv4' WHEN serv5 = 1 THEN 'serv5' WHEN serv6 = 1 THEN 'serv6' END AS column_with_value_1 FROM your_table_name;
把上面的your_table_name替换成你实际的表名就行,运行后就能得到你想要的结果:
id | column_with_value_1 ----|--------------------- 001 | serv4 002 | serv2 003 | serv6
场景2:可能存在多行多列值为1的情况
如果你的数据里某一行可能有多个列的值都是1,想要把所有匹配的列名都列出来,可以用UNION ALL + 聚合函数的方式先把表结构“转置”(unpivot),再筛选聚合:
SELECT id, STRING_AGG(column_name, ', ') AS columns_with_value_1 FROM ( SELECT id, 'serv1' AS column_name, serv1 AS value FROM your_table_name UNION ALL SELECT id, 'serv2', serv2 FROM your_table_name UNION ALL SELECT id, 'serv3', serv3 FROM your_table_name UNION ALL SELECT id, 'serv4', serv4 FROM your_table_name UNION ALL SELECT id, 'serv5', serv5 FROM your_table_name UNION ALL SELECT id, 'serv6', serv6 FROM your_table_name ) AS unpivoted_data WHERE value = 1 GROUP BY id;
这个写法会把同一行里所有值为1的列名用逗号分隔拼在一起,比如如果某一行serv2和serv4都是1,就会返回serv2, serv4。
内容的提问来源于stack exchange,提问作者Dhairya Lakhera




