首页 > 解决方案 > 更改列值(实际上没有在数据库中更新它)并将多行列为一行上的列值

问题描述

所以,我使用 Heroku 数据剪辑来快速监控信息。这个 SQL 片段:

SELECT name, owner, id AS guild 
FROM rooms JOIN guilds ON rooms.name=guilds.room 
ORDER BY rooms.name DESC

给我

图片

我怎样才能改变它,以便所有guild共享相同的 sname都列在它下面guild,匹配的 sowner旁边有一个星号?(我想以这种方式删除所有者列)

基本上,

Testing
    422950512657432578
    431220877250658305*
BFClannet
    337583271787626503*
    216908635987509249

或类似的规定。

编辑:(也许每个都name应该是一列,并且guilds应该在列下作为单独的行列出)

标签: sqlpostgresql

解决方案


这可以满足您的要求:

with t as (
      select 'Testing' as name, 431220877250658305 as owner, 422950512657432578 as guild union all
      select 'Testing' as name, 431220877250658305 as owner, 431220877250658305 as guild union all  
      select 'BFClannet' as name, 337583271787626503 as owner, 337583271787626503 as guild union all  
      select 'BFClannet' as name, 337583271787626503 as owner, 216908635987509249 as guild
     )
select coalesce(guild, name)
from ((select t.name, t.guild || (case when t.owner = t.guild then '*' else '' end) as guild
       from t
      ) union all
      (select distinct t.name, null
       from t
      )
     ) x
order by name, guild nulls first;

是一个 db<>fiddle。

这个想法是计算你想要的行。最大的技巧是订购它们,所以名字是第一位的。


推荐阅读