我正在尝试使用3个id列作为连接值从PostgreSQL的引用表中获得单个描述列。
我有一个ID表,如下所示:
+-----+-----+-----+
| id1 | id2 | id3 |
+-----+-----+-----+
| 1 | 2 | 3 |
| 4 | 6 | 5 |
+-----+-----+-----+
和参考表;
+----+----------+
| id | desc |
+----+----------+
| 1 | apple |
| 2 | boy |
| 3 | cat |
| 4 | dog |
| 5 | elephant |
| 6 | Flight |
+----+----------+
期望的预期输出如下
我只需要另外附加一个“ / M”即可。
如果id2和id3都为空,则不必添加/ M
+-----------------------+
| desc |
+-----------------------+
| apple+boy+cat/M |
| dog+Flight+Elephant/M |
+-----------------------+
答案 0 :(得分:4)
您可以使用string_agg()
用一个表达式连接所有行。像这样:
select (select string_agg(r.descr, '+' order by r.id)||
case when count(r.descr) > 1 then '/M' else '' end
from ref r
where id in (i.id1, i.id2, id3)) as descr
from id_table i;
在线示例:https://rextester.com/KVCGLD44632
上面按ID值对描述进行排序。如果您需要保留“ id表”中列的顺序,则可以使用以下方法:
select (select string_agg(r.descr, '+' order by t.idx)||
case when count(r.descr) > 1 then '/M' else '' end
from ref r
join (values (i.id1, 1), (i.id2, 2), (i.id3, 3)) as t(id, idx)
on t.id = r.id
) as descr
from id_table i;
请注意,desc
是保留关键字,请勿将其用作列名。这就是为什么我在示例中使用descr
的原因。