【问题标题】:Change {NULL} in Postgres ARRAY to NULL将 Postgres ARRAY 中的 {NULL} 更改为 NULL
【发布时间】:2023-03-08 21:29:01
【问题描述】:

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

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

DBFIDDLE

我尝试使用array_remove(){NULL} 更改为NULL

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;

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

【问题讨论】:

  • 请提供表格定义。 demo
  • 这个问题有误导性,如果你能说得清楚一点就好了。如果我理解标题,你需要nullif(z, '{null}')
  • 我尽我所能编辑了问题并添加了一个 dbfiddle(演示)[dbfiddle.uk/…
  • 目前还不清楚,您要实现什么:小提琴中的表定义有一个整数字段 z。你写 "where z is either null OR {NULL}" 但是 z 不能是 {NULL} 给定你的表定义。

标签: arrays postgresql null


【解决方案1】:

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

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

db小提琴here

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

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

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2015-04-27
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多