在 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】:
您可以将COALESCE
与NULLIF
结合使用以获得简短而有效的解决方案:
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 值的主要内容,如果未能解决你的问题,请参考以下文章