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)嵌套查询将不返回任何行。如果没有返回任何行,COALESCE
或NULLIF
的函数将永远不会执行。必须返回一行才能使这些函数作用于行值...因为我从未听说过具有从 0
开始并且通常从 1
开始的 PK 自动递增字段的表“没有返回记录”的结果集将始终将 NULL 值返回到实体化视图列中。
我之后运行的查询从该物化视图中轮询行将作为COALESCE(etc etc)
正常运行,因为现在该列中有一个实际的 NULL 值。
【讨论】:
以上是关于POSTGRES COALESCE(NULLIF(c.name,''), 'unassigned') 不工作的主要内容,如果未能解决你的问题,请参考以下文章
Oracle中的NVL,NVL2,NULLIF,COALESCE函数
mysql几个常用的判空函数:isnull, ifnull, nullif, coalesce