Sql COALESCE和CASE之间的差异不为空

Sql COALESCE和CASE之间的差异不为空,sql,postgresql,coalesce,Sql,Postgresql,Coalesce,我正在将一些报告从jasper reports SQL替换为JavaEE本机查询 我发现一个SQL查询postgres具有: SELECT --many rows (CASE WHEN description IS NOT NULL THEN description ELSE '' END), --varchar(200) COALESCE(house_number, ''), --varchar(20) COALESCE(

我正在将一些报告从jasper reports SQL替换为JavaEE本机查询 我发现一个SQL查询postgres具有:

    SELECT
        --many rows
        (CASE WHEN description IS NOT NULL THEN description ELSE '' END), --varchar(200)
        COALESCE(house_number, ''), --varchar(20)
        COALESCE(floor_number, ''), --varchar(20)
        (CASE WHEN (power IS NOT NULL AND power > 0) THEN power ELSE 0 END)
   FROM
       --table
使用COALESCE和CASE不为NULL有什么区别吗

联合描述

在某些情况下会返回不同的结果吗

合并为文本“0”


或者在某些情况下,一个比另一个更快?

在大多数情况下,这两个是相同的。我认为标准将COALESCEX,Y定义为:


在大多数情况下,这完全符合您的期望

有一个区别。该标准的一种解释是,当值不为空时,对X进行两次评估。在大多数情况下,这没有什么区别。在大多数情况下,值无论如何都会被缓存

然而,博士后并不这样做。它实现了对标准更合理的解释。换句话说,这两个表达式在Postgres中并不完全相同,因为Postgres足够聪明,可以对第一个表达式求值一次,不管它是否为NULL

如果有一个值发生变化的易失性函数,则可以看到效果。在Postgres中,以下返回x和y的次数大致相同:

select v.x, coalesce(case when random() > 0.5 then 'x' end, 'y')
from (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)) v(x);
SQL Server中的等效代码返回y的一半时间,以及x和NULL的四分之一时间,因为SQL Server将这两个构造视为完全等效,并在某些情况下对第一个参数求值两次

您可以在dbfiddles和中看到这一点


但是,SQL

您是否尝试过对这两个问题进行分析?另外,我不认为你的权力例子会起到同样的作用,即-1是的,我有。我得到了同样的结果,但我担心会忽略一些特殊情况。谢谢你@JakeLuby,我忽略了负面情况。
select v.x, coalesce(case when random() > 0.5 then 'x' end, 'y')
from (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)) v(x);