从另一个表的3个不同列的表中获取串联的desc

时间:2019-04-29 06:47:19

标签: sql postgresql

我正在尝试使用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 |
+-----------------------+

1 个答案:

答案 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的原因。