Ale*_*rev 11 arrays postgresql where-clause
我有一个问题:
SELECT bar, (SELECT name FROM names WHERE value = bar) as name
FROM foobar WHERE foo = 1 and bar = ANY (1,2,3)
Run Code Online (Sandbox Code Playgroud)
我的问题是,当表中没有包含任何行bar = 3(或者请求的任何其他值)时foobar,不会为该值的bar返回任何行.
我希望我的查询返回一行[bar, NULL],但是想不出办法来解决这个问题.
这甚至可能吗?
小智 15
也许这种方法就是你所追求的:
测试平台:
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;
Run Code Online (Sandbox Code Playgroud)
原方法:
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)
Run Code Online (Sandbox Code Playgroud)
替代方法:
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)
Run Code Online (Sandbox Code Playgroud)
如果你在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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33489 次 |
| 最近记录: |