postgresql 结果查询为空时Case返回null

s3fp2yjn  于 2022-12-26  发布在  PostgreSQL
关注(0)|答案(1)|浏览(797)

我尝试从表初始化变量,但当查询结果返回0时,行大小写表达式不起作用,例如:

do $$
declare _reportId bigint := null;
        _serviceId bigint := null; 
begin

    _serviceId := 12;
    _reportId := null;

    select  case when _serviceId is null then rp.value::bigint else _serviceId end
    into    _serviceId
    from    rep.reportparameters as rp
    where   rp.reportid = _reportId;

    RAISE NOTICE '%', _serviceId;
end;
$$;

因此,在此参数变体中,我需要_serviceId值12(因为查询结果返回0行,表中没有带空值的reportId)。但我有_serviceIdnull
SQL Server中的模拟构造工作得很好,它们为@serviceId返回12:

DECLARE @reportId bigint = NULL, 
        @serviceId bigint = null; 

SET @serviceId = 12;

SELECT  CASE when @serviceId is null then rp.[value] else @serviceId end
from    rep.reportparameters as rp
where   rp.reportid = @reportId;

SELECT @serviceId

为什么在PostgreSQL的情况下不工作?

stszievb

stszievb1#

如手册中所述,如果没有返回行,则INTO赋值将变量设置为NULL。如果没有选择行,则CASE表达式永远不会求值,因此它不能将NULL值更改为其他值。
您可以将coalesce()用于直接赋值:

do $$
declare 
  _reportId bigint := null;
  _serviceId bigint := null; 
begin

    _reportId := null;
    _serviceid := 12;
    _serviceid := coalesce((select rp.value::bigint
                            from rep.reportparameters as rp
                            where rp.reportid = _reportId), _serviceid);

    RAISE NOTICE '%', _serviceId;
end;
$$;

相关问题