POSTGRES COALESCE(NULLIF(c.name,''), 'unassigned') 不工作

Posted

技术标签:

【中文标题】POSTGRES COALESCE(NULLIF(c.name,\'\'), \'unassigned\') 不工作【英文标题】:POSTGRES COALESCE(NULLIF(c.name,''), 'unassigned') not workingPOSTGRES COALESCE(NULLIF(c.name,''), 'unassigned') 不工作 【发布时间】:2016-08-23 20:01:56 【问题描述】:

如果没有值,除了NULL 之外,没有任何版本的字符变化字段会返回任何内容......这真的很令人沮丧

CASE WHEN COALESCE(NULLIF(e.name,''),'unassigned') IS NULL THEN 'unassigned' ELSE a.name END

是我的最终测试,它仍然只是返回 NULL,除非该字段有值

它的字符变化(255)

COALESCE(a.name,'unassigned') // won't work
NULLIF(a.name,'') // won't work
NULLIF(a.name,NULL) // won't work
COALESCE(NULLIF(a.name,''),'unassigned') // won't work

但是,我使用0 的那一刻,它可以工作..

这是怎么回事?

它是一个字符变化(255)字段,它被设置为默认为空

作为一个问题,表列的构建是

name varying character(255) DEFAULT(NULL)

所以我知道它正在输入 NULL 我已经做了一个

SELECT * FROM <tbl> WHERE name IS NULL; 当然,我返回所有带有 a.name 的 NULL 行...那么这是怎么回事?

【问题讨论】:

“行不通”是什么意思?它返回了什么,您希望它返回什么? nullif(): The NULLIF function returns a null value if value1 equals value2; otherwise it returns value1.。如果a.name 为空,根据定义,它永远不能等于或不等于''。空值永远不能等于任何东西,包括它自己。 null 是有毒的,并且使涉及它的大多数操作也具有空结果。您的 nullif() 仅在 a.name 字面上是一个空字符串时才有效。 好吧,因为 COALESCE 测试了 NULL,我用“未分配”替换它,它“不起作用”,因为无论如何,它总是返回 NULL @MarcB 嘿,是的,我知道,但是,coalesce 应该测试NULL,所以因为我知道字段值为NULL,它应该返回'unassigned',这当然是它还没有……当我使用时:COALESCE(a.name,'0') 它在列中返回0,这很荒谬。即使我强制大小写为::text::character varying,它仍然返回NULL,除非我使用整数......这对我来说只是迟钝。将具有整数结果的文本/字符可变字段转换为字符串时,从列设计开始就显然是一个字符串,它的价值是什么? 条件COALESCE(NULLIF(e.name,''),'unassigned') IS NULL 始终为假。 【参考方案1】:

好的...对于所有决定回答我的人:

COALESCE(NULLIF(e.name,''),'unassigned') IS NULL...

此方法永远不会在返回“无记录”时起作用,因为这是一个创建物化视图的存储过程,我在其中通过嵌套查询进行轮询 - 列可能具有 0 (作为默认 id = other_id)嵌套查询将不返回任何行。如果没有返回任何行,COALESCENULLIF 的函数将永远不会执行。必须返回一行才能使这些函数作用于行值...因为我从未听说过具有从 0 开始并且通常从 1 开始的 PK 自动递增字段的表“没有返回记录”的结果集将始终将 NULL 值返回到实体化视图列中。

我之后运行的查询从该物化视图中轮询行将作为COALESCE(etc etc) 正常运行,因为现在该列中有一个实际的 NULL 值。

【讨论】:

以上是关于POSTGRES COALESCE(NULLIF(c.name,''), 'unassigned') 不工作的主要内容,如果未能解决你的问题,请参考以下文章

nvl、nvl2、nullif、coalesce函数的区别

Oracle中的NVL,NVL2,NULLIF,COALESCE函数

mysql几个常用的判空函数:isnull, ifnull, nullif, coalesce

谷歌大查询:需要帮助将 Postgres 查询转换为谷歌大查询

使用 coalesce() 避免嵌套聚合错误

选择列,如果空白从另一个选择