Postgres RIGHT JOIN自定义数组

时间:2013-03-26 16:45:16

标签: postgresql

我正在使用Postgres 9.1并希望在没有数据的情况下得到一些空白的结果。我的查询如下所示:

SELECT institution_id FROM ... WHERE institution_id IN (1, 3, 4, 5, 7, 9)

......对于这个问题并不重要,重要的是它返回数组中的institution_ids(1,3,4,5,7,9)的结果,并且它包括那些没有数据的机构。以下是当前输出的示例

days    treatments    institution_id
266    6996    4
265    5310    1
267    3361    5
260    2809    3
264    5249    7

我想要的输出示例是

days    treatments    institution_id
266    6996    4
265    5310    1
267    3361    5
260    2809    3
264    5249    7
               9

我知道我可以通过使用以下查询来实现这一目标

SELECT * FROM (SELECT institution_id FROM ... WHERE institution_id IN (1, 3, 4, 5, 7, 9)) RIGHT JOIN generate_series(1,9) ON generate_series = institution_id WHERE generate_series IN (1, 3, 4, 5, 7, 9)

然而,这是额外的工作,因为generate_series(1,9)创建了我不感兴趣的institution_ids,它要求我知道最大的institution_id先验,并且它引入了一个不必要的WHERE子句。理想情况下,我想要一个像下面这样的查询

SELECT * FROM (SELECT institution_id FROM ... WHERE institution_id IN (1, 3, 4, 5, 7, 9)) RIGHT JOIN (1, 3, 4, 5, 7, 9) ON generate_series = institution_id

其中(1,3,4,5,7,9)只是Postgres用于JOIN命令的数组。我也已经尝试过[1,3,4,5,7,9]和{1,3,4,5,7,9}都无济于事。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:4)

select i.days, i.treatments, s.id institution_id
from
    institution i
    right join (
        values (1), (3), (4), (5), (7), (9)
    ) s (id) on i.institution_id = s.id

或者

select i.days, i.treatments, s.id institution_id
from
    institution i
    right join
    unnest(array[1, 3, 4, 5, 7, 9]) s (id) on i.institution_id = s.id