Измените {NULL} в массиве Postgres на NULL - PullRequest
0 голосов
/ 05 января 2019

У меня есть таблица t со столбцом массива z в Postgres 9.5. Я хочу выбрать id, где z равно NULL ИЛИ {NULL}.

id |   z
---+--------
 1 | {NULL} 
 2 |  null     

См. DBFIDDLE

Я пытался изменить {NULL} на NULL с помощью array_remove():

SELECT id, 
array_remove(z,NULL) as removed
from t;

Возвращает:

id |    z   | removed 
---+--------+-------
 1 | {NULL} |   {}      
 2 |  null  |  null

Однако, если я сделаю запрос:

select id, z from t where removed is null;

У меня все еще есть идентификатор 1. В идеале, я бы хотел избежать повторного создания группы.

1 Ответ

0 голосов
/ 06 января 2019

Кому заменить массив одним элементом NULL ('{NULL}') на NULL, я предлагаю NULLIF:

SELECT id, NULLIF(z, '{NULL}') AS z
FROM   t;

дБ <> скрипка здесь

'{NULL}' - это (нетипизированный) литерал массива и то же значение, что и в результате ARRAY[NULL] - по умолчанию используется тип данных text[] без явного ввода или приведения. Вышеприведенное работает для любого типа массива: int[], date[], ..., поскольку литерал неявно приведен к типу z.

Пустой массив ('{}') или массив с 1 или более NULL-элементами ('{NULL}') не совпадают с NULL, array_remove() - неправильный инструмент.

...