【问题标题】: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 始终为假。

标签: postgresql postgresql-9.4


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多