Как преобразовать результат пересечения двух массивов в массив Integer из запроса SQL в массив Integer в postgresql - PullRequest
2 голосов
/ 03 ноября 2011

Запрос 1:

SELECT ARRAY(select id from contacts where id = 0)::INT[],
       ARRAY[]::INT[],
       ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[] = ARRAY[]::int[]

Дает этот результат:

int4    array   ?column?                                                                    
{}      {}      TRUE

Запрос 2:

SELECT (ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[]
      & ARRAY(select id from contacts where id = 0)::INT[]),
        ARRAY[]::INT[],
       (ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[]
      & ARRAY(SELECT id FROM contacts WHERE id = 0)::INT[]) = ARRAY[]::int[]

Создает другой результат:

?column?    array   ?column?                                                            
{}              {}      FALSE

Почему разница?

Есть ли другой способ сравнить пустой массив целых чисел с результатом пересечения двух массивов, как во втором запросе?

1 Ответ

2 голосов
/ 03 ноября 2011

Стандартный PostgreSQL не поддерживает оператор пересечения ARRAY.Вы должны установить дополнительный модуль intarray .

Ваш вопрос сводится к следующему:
Пересечение двух пустых целочисленных массивов приводит к пустому целочисленному массиву.Почему этот запрос дает false?

SELECT ('{}'::int[] & '{}'::int[]) = '{}'::int[]

Или в другом синтаксисе, означающем то же самое:

SELECT (ARRAY[]::int[] & ARRAY[]::int[]) = ARRAY[]::int[]

В то время как это приводит к true:

SELECT '{}'::int[] = '{}'::int[]

И да, это очень хороший вопрос. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *'Х, были были были '10 ч *' '.

Другими словами, первый представляет собой пустой массив, а второй - одномерный массив с пустым элементом.

Это может быть очень запутанным.Например, посмотрите эту ветку о , как обрабатывать string_to_array () с пустым выводом .
Я не уверен, что оператор & здесь делает правильные вещи.

...