将 Postgres ARRAY 中的 {NULL} 更改为 NULL

moo*_*hot 1 arrays postgresql null

我在 Postgres 9.5中t有一个带有数组列的表z。我想选择id其中z要么是NULLOR {NULL}

id |   z
---+--------
 1 | {NULL} 
 2 |  null     
Run Code Online (Sandbox Code Playgroud)

DBFIDDLE

我试图改变{NULL}NULLarray_remove()

SELECT id, 
array_remove(z,NULL) as removed
from t;
Run Code Online (Sandbox Code Playgroud)

返回:

id |    z   | removed 
---+--------+-------
 1 | {NULL} |   {}      
 2 |  null  |  null
Run Code Online (Sandbox Code Playgroud)

但是,如果我查询这个:

select id, z from t where removed is null;
Run Code Online (Sandbox Code Playgroud)

我仍然得到 id 1。理想情况下,我想避免取消嵌套和分组备份。

Erw*_*ter 5

要将具有单个 NULL 元素 ( '{NULL}')的数组替换为NULL,我建议NULLIF

SELECT id, NULLIF(z, '{NULL}') AS z
FROM   t;
Run Code Online (Sandbox Code Playgroud)

db<>在这里摆弄

'{NULL}'是一个(无类型的)数组字面量,并且与产生的值相同 ARRAY[NULL]- 默认为text[]没有显式输入类型或强制转换的数据类型。以上适用于任何数组类型:int[], date[], ... 因为文字被z隐式强制转换为类型。

空数组 ( '{}') 或具有 1 个或多个 NULL 元素的数组 ( '{NULL}') 与 不同NULLarray_remove()不是正确的工具。