sql - 在 Postgres 中,对 INSERT 使用值数组

标签 sql postgresql

有一组值。如果它们尚不存在,我希望将它们中的每一个插入为记录。这可以在 SQL 中在一个语句中完成吗?

传统的 javascript 方法:

[4,5,8]forEach( x => queryParams(
   insert into t1( c1 ) values( $1 )
   where not exists( select 1 from t1 where c1 = $1`,
   [x]
);

理想的情况是这样的

queryParams(
 `some fancy SQL here`,
 [ `{${join[4,5,8]}}` ]
);

这有很多原因,包括限制服务器往返和交易的成本。

最佳答案

您可以使用相关子查询来查找不存在的符合条件的值:

INSERT INTO Records (X)
    SELECT X
    FROM unnest(ARRAY[4,5,8]) T (X)
    WHERE NOT EXISTS (SELECT * FROM Records WHERE X = T.X);

SQL fiddle :http://sqlfiddle.com/#!15/e0334/29/0

上面编辑为使用 unnest

关于sql - 在 Postgres 中,对 INSERT 使用值数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31622293/

相关文章:

sql - 使用时间戳差异将页面浏览量分组到 session 中

php - 如何将具有不同数量结果的 Postgres 结果转换为 PHP 中的有序列表

database - 错误 :must be owner of database

sql - 数据类型 varchar 和 datetimeoffset 在 add 运算符中不兼容

SQL来自一个分组的两个条件

sql - 该列在IN子句中不存在,但是SQL运行

mysql - 根据计数结果选择不同的数据

python - 有效地生成所有可能的4人团队组合,其中包含130个角色中的特定角色并计算某些值

ruby-on-rails - Rails 应用程序中的 Postgres LIKE

postgresql - 是否需要在函数内设置statement_timeout?