在PostgreSQL中使用 COALESCE 处理 NULL 值

73

我有以下的查询

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;

上述查询返回的结果如附图所示: enter image description here

然而我想使用 COALESCE 将所有的空值替换为 0,请告诉我如何在上述 SELECT 查询中实现此目的。

现在我使用 COALESCE 修改了查询如下:

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所示。

我仍然收到一行带有空值的数据。


4
你尝试使用 COALESCE 将空值替换为零了吗?出了什么问题? - Evgeniy Chekan
2
没有,我还没有尝试过,请使用 COALESCE 函数演示给我看。 - ronan
4
请尝试使用coalesce()函数并报告您对它的任何问题。如果您不确定如何使用,请阅读手册:http://www.postgresql.org/docs/current/static/functions-conditional.html#FUNCTIONS-COALESCE-NVL-IFNULL。"* 不,我还没有尝试过 *"不是SO工作的方式。 - user330315
4
此外,同时使用 distinctgroup by 没有意义。group by 1,2,3 已经使所有列都不重复了,distinct 运算符也是如此。 - user330315
6
你可能在那里除了空值之外还有空字符串 - 这些空字符串不会被coalesce()修改,你需要使用一些"case"语句。为什么你的数字是字符串呢? - Arvo
显示剩余4条评论
2个回答

170

您可以使用NULLIFCOALESCE结合使用,以获得一个简短、高效的解决方案:

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

NULLIF函数将在yourField等于第二个值(''示例中)时返回null,从而使COALESCE函数在所有情况下都能完全运行:

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

8
如果您使用“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 = '';

这将使今后的连接和选择过程更加简单明了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接