如何在postgresql中加入整数?

时间:2015-07-08 11:37:05

标签: sql postgresql

我有一个提供ID列表的查询:

ID
2
3
4
5
6
25

IDinteger

我想在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))

不起作用

错误仍然是:

  

错误:运算符不存在:整数=整数[]

2 个答案:

答案 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/SOME9.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返回的值列表。