質問があります:
SELECT bar, (SELECT name FROM names WHERE value = bar) as name
FROM foobar WHERE foo = 1 and bar = ANY (1,2,3)
私の問題は、テーブルfoobar
にbar = 3
(または要求された他の値)を含む行がない場合、そのbarの値に対して行が返されないことです。
代わりに[bar, NULL]
の行を返すクエリが欲しいのですが、これにアプローチする方法を考えることができません。
これも可能ですか?
おそらく、このアプローチのようなものがあなたが求めているものです:
テストベッド:
create view names as
select 1 as value, 'Adam' as name union all select 2, 'Beth';
create view foobar as
select 1 as foo, 1 as bar union all select 1, 2;
元の方法:
select bar, (select name from names where value = bar) as name
from foobar
where foo = 1 and bar = any (array[1, 2, 3]);
bar | name
-----+------
1 | Adam
2 | Beth
(2 rows)
別の方法:
with w as (select unnest(array[1, 2, 3]) as bar)
select bar, (select name from names where value = bar) as name
from w left outer join foobar using(bar);
bar | name
-----+------
1 | Adam
2 | Beth
3 |
(3 rows)
8.3以前を使用している場合、組み込みのunnest
関数はありませんが、独自の(あまり効率的ではない)置換をロールすることができます。
create or replace function unnest(anyarray) returns setof anyelement as $$
select $1[i] from generate_series(array_lower($1,1), array_upper($1,1)) i;
$$ language 'sql' immutable;
SELECT vals.bar, name
FROM (
SELECT *
FROM unnest([1, 2, 3]) AS bar
) vals
LEFT JOIN
foobar
ON foobar.foo = 1
AND foobar.bar = vals.bar
LEFT JOIN
names
ON names.value = vals.bar