Как преобразовать результат пересечения двух массивов в целочисленный массив из SQL-запроса в целочисленный массив в postgresql

Запрос 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

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

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


person Rafiu    schedule 03.11.2011    source источник


Ответы (1)


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

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

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

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

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

Пока это дает true:

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

И да, это очень хороший вопрос.


Я могу объяснить разницу:

SELECT array_dims('{}'::int[])
<NULL>

SELECT array_dims('{}'::int[] & '{}'::int[])
[1:0]

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

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

person Erwin Brandstetter    schedule 03.11.2011