在SELECT中使用CTE中的数组... WHERE ... ANY

时间:2017-09-29 12:14:04

标签: sql postgresql

我想在CTE中创建一次ID数组,并在多个ANY中使用它。但是我在第一个卡住了。使用PG 9.3

WITH x AS (
    SELECT ARRAY(SELECT * FROM generate_series(1, 10)) AS a
)
SELECT 1
WHERE 2 = ANY(SELECT a FROM x)

我期望ANY中的SELECT语句将返回先前创建的数组。相反,我得到了这个错误:

  

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

     

第6行:在哪里2 =任何(选择一个来自x)

我不明白这是什么问题,因为select语句应该返回一个数组,而ANY 需要一个数组。

我当然不能在CTE中创建数组并且每次都在任何时候动态创建它,但我认为这比创建它一次性能要差。我必须有一个数组,因为没有数组的任何东西会改变查询计划(当我在实际的表上执行此操作时,而不是这个小例子)会改变性能不佳的东西。

2 个答案:

答案 0 :(得分:1)

ANY有两种形式。如果您想使用ANY(array expression):

WITH x AS (
    SELECT ARRAY(SELECT * FROM generate_series(1, 10)) AS a
)

SELECT 1
FROM x
WHERE 2 = ANY(a)

或者如果您想使用ANY(subquery):

WITH x AS (
    SELECT * FROM generate_series(1, 10) AS a
)

SELECT 1
WHERE 2 = ANY(SELECT a FROM x)

答案 1 :(得分:0)

执行此操作的常规SQL方法不使用数组:

WITH x AS (
      SELECT gs.a
      FROM generate_series(1, 10)) AS gs(a)
     )
SELECT 1
WHERE 2 IN (SELECT a FROM x);

当然,您可能希望出于不同的原因使用数组(例如学习数组)。但是你应该至少理解解决这个问题的SQL方法。