Оператор не существует: символ меняется = символ меняется [] - PullRequest
0 голосов
/ 27 февраля 2020

Как вы можете видеть в моем запросе SQL, у меня есть подзапрос, который возвращает строковый массив (varchar[]). Я пытаюсь отфильтровать table_1 значения по этому массиву, который я передаю в команде ANY. По какой-то причине я вижу эту ошибку:

ОШИБКА: оператор не существует: символ меняется = символ меняется [] Ни один оператор не соответствует данному имени и типу аргумента. Возможно, вам потребуется добавить явные приведения типов.

Типы данных столбцов table_1.colomn_a и table_2.colomn_a: varchar.

PostgreSQL версия: 11.4

Где я допустил ошибку?

select
    table_1.*
from
    table_1
where
    table_1.colomn_a = any(
        select
            array_agg(table_2.colomn_a)
        from
            table_2
    )

Конечно, я могу использовать такой код, но я хочу знать причину ошибки в первом запросе:

select
    table_1.*
from
    table_1
where
    table_1.colomn_a in(
        select
            table_2.colomn_a
        from
            table_2
    )

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Ваш подзапрос:

select
    array_agg(table_2.colomn_a)
from
    table_2

возвращает массив массива varchar, not массив varchar. Итак, вы пытаетесь сравнить varchar (table_1.colomn_a) с массивом varchar (array_agg(table_2.colomn_a)), что невозможно. Подумайте, есть ли в вашем подзапросе явное выражение group by, например

select
    array_agg(table_2.colomn_a)
from
    table_2
group by table_2.colomn_b

. В этом случае очевидно, что запрос возвращает массив массивов varchar (по одному для каждого значения table_2.colomn_b). В вашем первом запросе есть неявное предложение group by, которое приводит к выводу в виде массива массива varchar. Вы можете просто использовать:

select
    table_2.colomn_a
from
    table_2

, и оно будет работать нормально (в этом случае = any эквивалентно in).

0 голосов
/ 27 февраля 2020

У вас уже есть массив. Поэтому используйте exists:

where exists (select 1
              from table_2 t2
              where table_1.colomn_a = any(t2.colomn_a)
             )

Нет необходимости собирать массивы в один большой массив, просто для анализа этого массива в поисках другого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...