在 PostgreSQL 中使用 COALESCE 处理 NULL 值

Posted

技术标签:

【中文标题】在 PostgreSQL 中使用 COALESCE 处理 NULL 值【英文标题】:Using COALESCE to handle NULL values in PostgreSQL 【发布时间】:2015-02-13 06:17:06 【问题描述】:

我有以下查询

SELECT  DISTINCT 
     pt.incentive_marketing, 
     pt.incentive_channel, 
     pt.incentive_advertising 
FROM test.pricing pt 
WHERE pt.contract_id = 90000 
group by 1,2,3 
order by pt.incentive_marketing;

上面的查询返回 o/p 如附图所示

但是我想使用 COALESCE 将所有空值替换为 0 请让我知道如何在上面的 SELECT 查询中实现这一点

现在我使用下面的合并进一步修改了查询

SELECT  
     COALESCE( pt.incentive_marketing, '0' ), 
     COALESCE(pt.incentive_channel,'0'), 
     COALESCE( pt.incentive_advertising,'0') 
FROM test.pricing pt 
WHERE pt.contract_id = 90000 
group by 1,2,3 

结果如图 2 所示。

我仍然收到一行空白值

【问题讨论】:

您是否尝试过使用COALESCE 将空值替换为零?究竟出了什么问题? 不,我没试过,请教我使用 coalesce 那么请尝试使用 coalesce() 函数并报告您遇到的任何问题。如果您不确定如何使用它,请阅读手册:postgresql.org/docs/current/static/… - “不,我没有尝试过”不是 SO 的工作方式。 另外:使用distinct group by 没有意义。 group by 1,2,3 已经使所有列都不同。 distinct 运算符也是如此。 除了空值之外,您可能还有空字符串 - 这些不会被 coalesce() 更改,您需要使用一些“case”语句。为什么你的数字还是字符串? 【参考方案1】:

您可以将COALESCENULLIF 结合使用以获得简短而有效的解决方案:

COALESCE( NULLIF(yourField,'') , '0' )

如果yourField 等于第二个值(示例中为''),The NULLIF function 将返回 null,从而使 COALESCE 函数在所有情况下都可以完全工作:

                 QUERY                     |                RESULT 
---------------------------------------------------------------------------------
SELECT COALESCE(NULLIF(null  ,''),'0')     |                 '0'
SELECT COALESCE(NULLIF(''    ,''),'0')     |                 '0'
SELECT COALESCE(NULLIF('foo' ,''),'0')     |                 'foo'

【讨论】:

【参考方案2】:

如果您使用0 和一个空字符串''null 来指定未定义,那么您遇到了数据问题。只需更新列并修复您的架构。

UPDATE pt.incentive_channel
SET   pt.incentive_marketing = NULL
WHERE pt.incentive_marketing = '';

UPDATE pt.incentive_channel
SET   pt.incentive_advertising = NULL
WHERE pt.incentive_marketing = '';

UPDATE pt.incentive_channel
SET   pt.incentive_channel = NULL
WHERE pt.incentive_marketing = '';

这将使加入和选择变得更加容易。

【讨论】:

以上是关于在 PostgreSQL 中使用 COALESCE 处理 NULL 值的主要内容,如果未能解决你的问题,请参考以下文章

错误:COALESCE 类型时间戳没有时区和整数无法匹配(Postgresql)

PostgreSQL判断是否为空coalesce

Postgresql COALESCE 性能问题

Postgresql 到 Laravel 雄辩

避免在 PostgreSQL 中被零除

postgresql 中类似IFNULL用法