我有一个提供ID列表的查询:
ID
2
3
4
5
6
25
ID
是integer
。
我想在ARRAY
类型的integers
中获得类似的结果:
ID
2,3,4,5,6,25
我写了这个查询:
select string_agg(ID::text,',')
from A
where .....
我必须将其转换为文本,否则将无效。 string_agg
期望获得(text,text)
这很好用,以后这个结果应该在许多期望ARRAY
整数的地方使用。
我试过了:
select ('{' || string_agg(ID::text,',') || '}')::integer[]
from A
WHERE ...
,其中{2,3,4,5,6,25}
类型为int4 integer[]
但这不是正确的类型......我需要与ARRAY
相同的类型。
例如SELECT ARRAY[4,5]
提供array integer[]
简单来说,我希望我的查询结果可以使用(例如):
select *
from b
where b.ID = ANY (FIRST QUERY RESULT) // aka: = ANY (ARRAY[2,3,4,5,6,25])
这是因为任何期望的数组而失败,并且它不适用于常规整数[],我收到错误:
错误:运算符不存在:整数=整数[]
注意:查询的结果是函数的一部分,并将保存在变量中以供以后工作。请不要将它带到您绕过问题的地方,并提供一个无法提供ARRAY
Integers
的解决方案。
编辑:为什么
select *
from b
where b.ID = ANY (array [4,5])
正在运作。但
select *
from b
where b.ID = ANY(select array_agg(ID) from A where ..... )
不起作用
select *
from b
where b.ID = ANY(select array_agg(4))
不起作用
错误仍然是:
错误:运算符不存在:整数=整数[]
答案 0 :(得分:1)
表达式select array_agg(4)
返回行集(实际上有1行的行集)。因此查询
select *
from b
where b.id = any (select array_agg(4)) -- ERROR
尝试将整数(b.id)与行的值(具有1列integer []类型)进行比较。它引发了一个错误。
要修复它,你应该使用一个返回整数的子查询(不是整数数组):
select *
from b
where b.id = any (select unnest(array_agg(4)))
或者,您可以将结果select array_agg(4)
的列名作为any
的参数,例如:
select *
from b
cross join (select array_agg(4)) agg(arr)
where b.id = any (arr)
或
with agg as (
select array_agg(4) as arr)
select *
from b
cross join agg
where b.id = any (arr)
更正式地说,前两个查询使用以下格式的ANY
:
expression operator ANY (subquery)
和其他两个使用
expression operator ANY (array expression)
就像文档中描述的那样:9.22.4. ANY/SOME 和9.23.3. ANY/SOME (array)。
答案 1 :(得分:0)
这个查询怎么样?这会给你预期的结果吗?
SELECT *
FROM b b_out
WHERE EXISTS (SELECT 1
FROM b b_in
WHERE b_out.id = b_in.id
AND b_in.id IN (SELECT <<first query that returns 2,3,4,...>>))
我试图做的是将ANY
的逻辑分解为两个单独的逻辑检查,以达到相同的结果。
因此,ANY
等同于EXISTS
的组合,其中至少有一个值IN
是您的第一个SELECT
返回的值列表。