Найти значение в массиве (Postgresql) - PullRequest
0 голосов
/ 06 сентября 2018

Далее возвращается « {3130,3135,2179,3186} », введите « INTEGER [] »:

SELECT
array_agg(c) AS c
FROM
(
SELECT 3130::INTEGER AS c
UNION
SELECT 3135::INTEGER AS c
UNION
SELECT 2179::INTEGER AS c
UNION
SELECT 3186::INTEGER AS c
) AS v

Если я попытаюсьнайти число «3186» путем непосредственного преобразования текста в целочисленный массив, он работает просто отлично:

SELECT 3186::INTEGER = ANY
(
'{3130,3135,2179,3186}'::INTEGER[]
)

Но если я попытаюсь сделать то же самое с результатом первого запроса, я получу " оператор не существует: integer = integer []"сообщение об ошибке:

SELECT 3186::INTEGER = ANY
(
    SELECT
    array_agg(c) AS c
    FROM
    (
    SELECT 3130::INTEGER AS c
    UNION
    SELECT 3135::INTEGER AS c
    UNION
    SELECT 2179::INTEGER AS c
    UNION
    SELECT 3186::INTEGER AS c
    ) AS v
)

Что я делаю не так?

Я использую PostgreSQL 9.5.3, PgAdmin1.22.1

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Есть две формы ANY(). В вашем запросе они смешаны.

Если вы хотите использовать ANY (array expression):

SELECT 3130 = ANY(
    ARRAY(
        SELECT 3130::INTEGER AS c
        UNION
        SELECT 3135::INTEGER AS c
        UNION
        SELECT 2179::INTEGER AS c
        UNION
        SELECT 3186::INTEGER AS c
    ) 
)

или

SELECT 3130 = ANY(array_agg(c))
FROM (
    SELECT 3130::INTEGER AS c
    UNION
    SELECT 3135::INTEGER AS c
    UNION
    SELECT 2179::INTEGER AS c
    UNION
    SELECT 3186::INTEGER AS c
    ) alias

Если вы хотите использовать ANY (subquery):

SELECT 3130 = ANY(
    SELECT 3130::INTEGER AS c
    UNION
    SELECT 3135::INTEGER AS c
    UNION
    SELECT 2179::INTEGER AS c
    UNION
    SELECT 3186::INTEGER AS c
)
0 голосов
/ 06 сентября 2018

Вы можете явно привести к INTEGER[]:

SELECT 3186::INTEGER = ANY(
(
    SELECT array_agg(c) AS c
    FROM (
       SELECT 3130::INTEGER AS c
       UNION
       SELECT 3135::INTEGER AS c
       UNION
       SELECT 2179::INTEGER AS c
       UNION
       SELECT 3186::INTEGER AS c
    ) AS v
)::INTEGER[]);

Демоверсия DBFiddle

...