【发布时间】: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始终为假。