将行类型的所有列重置为 NULL

Reset all columns of a row type to NULL

我想知道是否可以将从一个类型创建的变量批量初始化为 null,而无需分别初始化它们

create type tp_data as (
    data01   text,
    data02   integer,
    data03   text
);

create function sp_function()
  returns setof tp_data as
$$
declare
    lr_data   tp_data;
begin
    for lr_data in
        select data.data01, data.data02, data.data03
        from data
    loop
        if lr_data.data01 = "cancelled" then

            -- what is the correct way to do this?
            lr_data.* := null;

            -- without having to do this
            lr_data.data01 := null;
            lr_data.data02 := null;
            lr_data.data03 := null;
        end if;

        return next lr_data;
    end loop;
end
$$
language plpgsql;

致电:

select * from sp_function();

以上显然是错误的,但是在 Informix 中我可以使用类似 "initialize lr_data.* to null" 的东西。有没有办法在 plpgsql 中做类似的事情?

您可以 NULL 分配给整个行类型:

lr_data := null;

这会将每一列设置为 NULL。

旁白:你的函数中有几个语法错误。整个功能可以从根本上简化...

这个查询可以替换整个函数:

SELECT (CASE WHEN data01 = 'cancelled' THEN NULL::tp_data ELSE d::tp_data END).*
FROM (SELECT data01, data02, data03 FROM data) d;

我知道这不是你问题的重点。但它表明我们也可以 cast NULL 到行类型,使 SQL 本身的所有列都为 NULL。