Мой запрос
SELECT
id,
ARRAY_AGG(session_os)::integer[]
FROM
t
GROUP BY id
HAVING ARRAY_AGG(session_os)::integer[] && ARRAY[1,NULL]
Это дает ERROR: array must not contain nulls
На самом деле я хочу получить такие строки, как
id | Session_OS
-------|-------------
641 | {1, 2}
642 | {NULL, 2}
643 | {NULL}
Пожалуйста, проверьте образец данных здесь
https://dbfiddle.uk/?rdbms=postgres_13&fiddle=7793fa763a360bf7334787e4249d6107
Оператор &&
не поддерживает значения NULL
. Значит, нужен другой подход. Например, вы можете сначала присоединить данные к таблице. Это дает вам id
s, которые связаны с вашими необходимыми данными. На втором шаге вы можете объединить все значения, используя эти id
s.
пошаговая демонстрация: db<>fiddle
SELECT
id,
ARRAY_AGG(session_os) -- 4
FROM t
WHERE id IN ( -- 3
SELECT
id
FROM
t
JOIN (
SELECT unnest(ARRAY[1, null]) as a -- 1
)s ON s.a IS NOT DISTINCT FROM t.session_os -- 2
)
GROUP BY id
NULL
.NULL
, используя оператор IS NOT DISTINCT FROM
, который учитывает NULL
.id
, которые можно использовать в фильтре WHERE
.Спасибо. Можете ли вы проверить, когда я передаю только null в массиве, он выдает ошибку. dbfiddle.uk/…
Благодарить. Работает нормально все.
Расширение intarray устанавливает собственный оператор &&
для int[], который не допускает NULL и имеет приоритет над встроенным оператором &&
.
Если вы не используете intarray, вы можете просто удалить его (за исключением dbfiddle, где вы не можете). Если вы используете его время от времени, я думаю, что лучше всего установить его в своей собственной схеме, которая не находится в вашем пути поиска. Затем вам нужно квалифицировать схему ее операторов, когда они вам нужны.
Кроме того, вы можете оставить intarray на месте, а схема квалифицировать обычные встроенные операторы, когда они вам нужны, как показано здесь.
Я получаю эту ошибку только тогда, когда установлено расширение intarray (которое dbfiddle, по-видимому, установило по умолчанию, что для меня немного странно)