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

The*_*age 4 postgresql null initialization bulk plpgsql

我想知道是否可以批量初始化从类型创建的变量为 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;
Run Code Online (Sandbox Code Playgroud)

称呼:

select * from sp_function();
Run Code Online (Sandbox Code Playgroud)

上面的内容显然是错误的,但是在 Informix 中我可以使用“将 lr_data.* 初始化为 null”之类的内容。有没有办法在 plpgsql 中做类似的事情?

Erw*_*ter 6

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

lr_data := null;
Run Code Online (Sandbox Code Playgroud)

这会将每一列设置为NULL

另外:您的函数中有一些语法错误。整个功能可以从根本上简化。此查询替换整个函数:

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

我知道这不是你问题的重点。但它表明我们也可以将值转换NULL为行类型来创建所有列NULL