如果使用PostgreSQL在SELECT语句中不存在连接的行,则返回特定值

时间:2016-02-24 15:14:23

标签: sql postgresql

我有两个包含以下内容的PostgreSQL表:

  1. 一些对象
  2. 有关具有数据类型的对象的一些数据
  3. 例如:

        |---ID---|---NAME---|
        |   1    |  name1   |
        |   2    |  name2   |
        |   3    |  name3   |
    
        |---ID_OBJ---|---TYPE---|---VALUE---|
        |      1     |  type_1  |    val1   | 
        |      1     |  type_2  |    val2   | 
        |      2     |  type_1  |    val3   | 
        |      3     |  type_2  |    val4   |
    

    我想在一行中获取有关每个对象的所有信息。问题是我也想要不存在的行的值:

        |---NAME---|---TYPE1---|---TYPE2---|
        |  name1   |    val1   |    val1   |
        |  name2   |    val3   |     NA    |
        |  name3   |     NA    |    val4   |
    

    我真的不明白如何继续获得这种无关系的关系。 EXISTS关键字是解决方案吗?

    编辑:我无法激活tablefunc扩展程序,因为我自己无法管理服务器,因此解决方案解释here无法轻松使用。

1 个答案:

答案 0 :(得分:2)

虽然Postgres支持crosstab,但我认为如果您知道所需的列,可以使用条件聚合轻松完成:

select t1.name,
       coalesce(max(case when type = 'type_1' then value end), 'NA') as type_1,
       coalesce(max(case when type = 'type_2' then value end), 'NA') as type_2
from t1 left join
     t2
     on t1.id = t2.id_obj
group by t1.name;