gpt4 book ai didi

postgresql - 在 node-postgres 查询字符串中使用 UNNEST 将数组作为多行插入的语法

转载 作者:行者123 更新时间:2023-11-29 12:23:20 25 4
gpt4 key购买 nike

我正在尝试插入一个简单的数字数组作为 PostgreSQL 表的不同行。

比如我要插入:

const arr = [1.1, 2.0, 3.40, 4.5, -5];

因此表“numeric_values_list”填充为:

id | val 
--------
1 | 1.1
2 | 2.0
3 | 3.40
4 | 4.5
5 | -5.6

使用 psql 终端,我可以获得此查询以产生所需的结果:

INSERT INTO numeric_values_list(val)
SELECT * FROM UNNEST (ARRAY[1.1, 2.0, 3.40, 4.5, -5]);

但是,我无法找出将产生相同结果的 postgres-pg 查询字符串的正确语法。以下对我不起作用:

  const list = [1.1, 2.0, 3.40, 4.5, -5];

// version 1
db.query('INSERT INTO numeric_values_list(val) SELECT * FROM UNNEST($1)', list)

// version 2
db.query('INSERT INTO numeric_values_list(val) SELECT * FROM UNNEST($1::numeric[])', list)

// version 3
db.query('INSERT INTO numeric_values_list(val) SELECT * FROM UNNEST($1::[])', list)

// version 4
db.query('INSERT INTO numeric_values_list(val) SELECT * FROM UNNEST ARRAY[($1)]', list)

我的问题是如何使用 pg-promise 库让它工作?
非常感谢。

最佳答案

这在使用 pg-promise 时会简单得多:

const arr = [1.1, 2.0, 3.40, 4.5, -5];

db.none('INSERT INTO numeric_values_list(val) SELECT * FROM UNNEST(ARRAY[$1:csv])', [arr])
.catch(error => {
/* when in error */
});

参见 CSV Filter .

如果你的输入总是一个非空数组,那么它可以进一步简化为:

db.none('INSERT INTO numeric_values_list(val) SELECT * FROM UNNEST($1)', [arr])
.catch(error => {
/* when in error */
});

那是因为默认情况下非空数组的格式为 pg-promise作为array[...]

检查一下:

const pgp = require('pg-promise')(/* init options */);

const s = pgp.as.format('$1', [arr]);

console.log(s); /*=> array[1.1,2,3.4,4.5,-5] */

关于postgresql - 在 node-postgres 查询字符串中使用 UNNEST 将数组作为多行插入的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57774474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com