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