Postgresql 插入时,如何以编程方式将空值转换为列的默认值?

Postgresql 插入时,如何以编程方式将空值转换为列的默认值?,postgresql,Postgresql,我有一个表,我为其中的一些列提供了默认值。我想创建一个函数,其参数与将任何空值修改为列的默认值后将在表中插入记录的列相对应。我不想以编程方式构造基于哪些参数为空的查询。基本上我想要 INSERT into Table (c1, c2, c3, c4) Values (coalesce(somevar, DEFAULT(c1)), ...) 这可能吗?我看到了。博士后提供类似的服务吗? 我使用的是9.1版 更新:这提供了一些有趣的解决方案,但不幸的是结果总是文本。我希望得到默认值作为它的真实数据

我有一个表,我为其中的一些列提供了默认值。我想创建一个函数,其参数与将任何空值修改为列的默认值后将在表中插入记录的列相对应。我不想以编程方式构造基于哪些参数为空的查询。基本上我想要

INSERT into Table (c1, c2, c3, c4)
Values (coalesce(somevar, DEFAULT(c1)), ...)
这可能吗?我看到了。博士后提供类似的服务吗? 我使用的是9.1版

更新:这提供了一些有趣的解决方案,但不幸的是结果总是文本。我希望得到默认值作为它的真实数据类型,以便我可以使用它来插入它。我试图找到一种解决方案,将默认值从文本转换为其作为文本提供的数据类型,但我找不到一种方法:

SELECT column_name, column_default, data_type
FROM information_schema.columns
WHERE (table_schema, table_name) = ('public', 'mytable')
AND column_name = 'mycolumn'
ORDER BY ordinal_position;

上面以文本形式返回列\u default和数据\u type,那么如何将列\u default转换为数据\u type的值?如果我能做到这一点,那么我的问题就会得到解决。

如果表定义接受所有列都带有默认值的INSERT,下面的两步方法可能会起作用:

CREATE FUNCTION insert_func(c1 typename, c2 typename, ...)
RETURNS VOID AS $$
DECLARE
 r record;
BEGIN
 INSERT into the_table default values  returning *,ctid INTO r;
 UPDATE the_table set
  col1=coalesce(c1,r.col1),
  col2=coalesce(c2,r.col2),
  ...
 WHERE the_table.ctid=r.ctid;
END;
$$ language plpgsql;
诀窍是在插入时将所有默认值放入r记录变量,然后在更新中使用它们来替换任何非默认值。ctid是一个伪列,用于指定刚刚插入的行的内部唯一ID


警告:如果某些列具有默认空值和非空检查,或者任何表示默认值不被接受的检查,则此方法将不起作用,因为第一次插入会失败。

我已经用一种类似于Daniel的解决方案解决了我的问题,方法是创建一个包含LIKE和DEFAULTS子句的临时表,以匹配我的行类型,然后使用

插入温度表c1,c2。。。值X1,默认值

对我感兴趣的任何列使用默认关键字。然后,通过从临时表中选择并使用

值x1,聚结X2,温度表c2


我不喜欢它,但它可以正常工作:我可以选择在哪些列上使用默认检查进行null替换,如果我重载函数以接受记录数组,它可以一次通过多行

你能解释一下吗?My columns被声明为NOT NULL DEFAULT xxxAlso,因此关键字DEFAULT不能在CASE或coalesce中使用。它抛出了一个错误:插入到表c1,c2值一些变量,合并一些其他变量,默认->抛出一个语法错误为噪音抱歉,我的错误