Sql ce(“|r.nam | | | | | | | | | | | | | | |”| r.def | | |,”; 如果结束; 端环; 参数列表:=rtrim(参数列表,,); 列列表:=rtrim(列列表','); 值列表:=rtrim(值列表,,); 执行格式(ddl、funcname、参数列表、表名、表名、表名、列列表、值列表); 结束; $$;
在您的情况下,生成的插入函数将是:Sql ce(“|r.nam | | | | | | | | | | | | | | |”| r.def | | |,”; 如果结束; 端环; 参数列表:=rtrim(参数列表,,); 列列表:=rtrim(列列表','); 值列表:=rtrim(值列表,,); 执行格式(ddl、funcname、参数列表、表名、表名、表名、列列表、值列表); 结束; $$;,sql,postgresql,sql-insert,sql-null,Sql,Postgresql,Sql Insert,Sql Null,在您的情况下,生成的插入函数将是: 创建或替换函数public.cars\u insert(make\u在字符中变化,model\u在字符中变化,具有\u自动\u传输\u在布尔值中,在\u日期\u在带有时区的时间戳中创建\u) 还车 语言plpgsql 作为$function$ 声明 结果(1)设置车辆;; 开始 插入汽车 ( 品牌、型号、有自动变速器、在日期创建 ) 价值观 ( make_in,model_in,coalesce(自动变速器已安装,错误),coalesce(在日期创建,现在()
创建或替换函数public.cars\u insert(make\u在字符中变化,model\u在字符中变化,具有\u自动\u传输\u在布尔值中,在\u日期\u在带有时区的时间戳中创建\u)
还车
语言plpgsql
作为$function$
声明
结果(1)设置车辆;;
开始
插入汽车
(
品牌、型号、有自动变速器、在日期创建
)
价值观
(
make_in,model_in,coalesce(自动变速器已安装,错误),coalesce(在日期创建,现在())
)
将*返回到结果集合中;
返回结果集;
结束;
$function$
您需要两条Insert语句;一个用于填充可为空的列,另一个用于忽略这些列,作为默认值,仅当您不引用要插入的列时使用。您尝试过上一次查询吗?我应该工作,应该工作,但遗憾的是没有。它返回以下错误:error:DEFAULT在此上下文行中是不允许的25:coalesce(has_automatic_transmission,DEFAULT),我也不使用动态sql,除非我绝对必须这样做。我相信一定有一种明智的方法可以使用sql语法来实现这一点,因为isAh,是的,我认为我阅读文档的速度太快了。我们不能将DEFAULT
用作函数的参数。这个SO答案可能有用:是的,我认为作为函数param的“DEFAULT”不再具有列的作用域,而是在列的作用域内被引用,这很愚蠢,但事实就是这样。很酷,但是你想在每个插入中都有两个子查询吗?@LaurenzAlbe:我不想这样做。这只是回答问题的概念证明。我更愿意在客户机中使用带有动态SQL的函数、触发器或处理空情况。公平地说,每个子查询只针对实际的NULL输入执行,因此如果NULL是一个罕见的异常,那么性能影响是有限的。当有6列具有默认值时,这不起作用,因为我必须为每个排列都有一个副本
CREATE TABLE IF NOT EXISTS public.cars
(
id serial PRIMARY KEY,
make varchar(32) not null,
model varchar(32),
has_automatic_transmission boolean not null default false,
created_on_date timestamptz not null DEFAULT NOW()
);
drop function if exists cars_insert;
create function cars_insert
(
in make_in text,
in model_in text,
in has_automatic_transmission_in boolean,
in created_on_date_in timestamptz
)
returns public.carsas
$$
declare result_set public.cars;
begin
insert into cars
(
make,
model,
has_automatic_transmission,
created_on_date
)
values
(
make_in,
model_in,
has_automatic_transmission_in,
created_on_date_in
)
returning * into result_set;
return result_set;
end;
$$
language 'plpgsql';
insert into cars
(
make,
model,
has_automatic_transmission,
created_on_date
)
values
(
make,
model,
COALESCE(has_automatic_transmission_in, DEFAULT),
COALESCE(created_on_date_in, DEFAULT)
)