通过 CTE 中的数组列查询
Querying by a array column from a CTE
我有一个带有数组列的 CTE,我想通过该 ID 数组过滤另一列。
with vars as (
select
(1, 7, 10000) bubble_ids,
'Frank' name
)
select * from walruses
inner join tusks on walruses.id = tusks.walrus_id
where (
name = (select name from vars)
and tusks.bubble_id IN (select bubble_ids from vars)
);
这会产生以下结果:ERROR: operator does not exist: integer = record
我试过取消嵌套——unnest(bubble_ids)
——结果是 ERROR: record type has not been registered
正确的做法是什么?
(1, 7, 10000)
没有定义数组。这是一个 row constructor ,它创建一个匿名记录(具有三个字段)。
一个array literal是用方括号写的,并且必须以关键字array
为前缀,例如array[1, 7, 10000]
。或者你可以把它写成一个字符串值:'{1,7,1000}'
当使用 CTE 作为 variables/parameters 的 "container" 时,我通常使用交叉连接来使其可供查询访问。即少打字
with vars as (
select
array[1, 7, 10000] bubble_ids,
'Frank' as name --<< you need the AS, because name is a keywod
)
select *
from walruses
inner join tusks on walruses.id = tusks.walrus_id
cross join vars v
where name = v.vars
and tusks.bubble_id = any(v.bubble_ids);
我更喜欢 values
子句而不是 select
来定义常数值。
with vars(bubble_ids, name) as (
values (array[1, 7, 10000], 'Frank')
)
select *
from walruses
inner join tusks on walruses.id = tusks.walrus_id
cross join vars v
where name = v.vars
and tusks.bubble_id = any(v.bubble_ids);
我有一个带有数组列的 CTE,我想通过该 ID 数组过滤另一列。
with vars as (
select
(1, 7, 10000) bubble_ids,
'Frank' name
)
select * from walruses
inner join tusks on walruses.id = tusks.walrus_id
where (
name = (select name from vars)
and tusks.bubble_id IN (select bubble_ids from vars)
);
这会产生以下结果:ERROR: operator does not exist: integer = record
我试过取消嵌套——unnest(bubble_ids)
——结果是 ERROR: record type has not been registered
正确的做法是什么?
(1, 7, 10000)
没有定义数组。这是一个 row constructor ,它创建一个匿名记录(具有三个字段)。
一个array literal是用方括号写的,并且必须以关键字array
为前缀,例如array[1, 7, 10000]
。或者你可以把它写成一个字符串值:'{1,7,1000}'
当使用 CTE 作为 variables/parameters 的 "container" 时,我通常使用交叉连接来使其可供查询访问。即少打字
with vars as (
select
array[1, 7, 10000] bubble_ids,
'Frank' as name --<< you need the AS, because name is a keywod
)
select *
from walruses
inner join tusks on walruses.id = tusks.walrus_id
cross join vars v
where name = v.vars
and tusks.bubble_id = any(v.bubble_ids);
我更喜欢 values
子句而不是 select
来定义常数值。
with vars(bubble_ids, name) as (
values (array[1, 7, 10000], 'Frank')
)
select *
from walruses
inner join tusks on walruses.id = tusks.walrus_id
cross join vars v
where name = v.vars
and tusks.bubble_id = any(v.bubble_ids);