You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动