将行类型的所有列重置为 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。
我想知道是否可以将从一个类型创建的变量批量初始化为 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。