更改列值(无需在数据库中实际更新),并在一行中将多行列为列值

时间:2019-07-05 22:15:02

标签: sql postgresql

因此,我正在使用Heroku数据夹快速监视信息。 此SQL片段:

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

给我

Image

如何更改它,以使所有共享同一guild的{​​{1}}都在其下列出,并且nameguild匹配,且owner旁边有一个星号它? (我想以这种方式删除所有者列)

基本上

Testing
    422950512657432578
    431220877250658305*
BFClannet
    337583271787626503*
    216908635987509249

或者类似的东西。

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

2 个答案:

答案 0 :(得分:0)

如果确切的输出必须是这样,则可以这样:

with data 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 
  case 
    when owner=0 then name 
    else '  ' ||
      case when owner=guild then cast(owner as varchar(100)) || '*' else cast(guild as varchar(100)) end
   end
from (
  select name, owner, guild from data union all
  select distinct name, 0, 0 from data
  ) kk
order by name,owner

您可以在这里进行测试:https://rextester.com/ZNMX89293

答案 1 :(得分:0)

这就是您想要的:

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;

Here是db <>小提琴。

想法是计算所需的行。最大的诀窍是订购它们,因此名称优先。