Rei*_*ica 9 sql postgresql casting node.js
下面的查询是根据插入的行数动态生成的。对于每一行数据,都有一个附加UNION SELECT语句。
INSERT INTO account_sale
(qty, price, product_id)
SELECT $1, $2, t.id
FROM inventory_product AS t
WHERE t.ebay_sku = $3
UNION
SELECT $4, $5, t.id
FROM inventory_product AS t
WHERE t.ebay_sku = $6
...
Run Code Online (Sandbox Code Playgroud)
当我尝试运行查询时,我得到以下信息:
错误:列“qty”的类型为整数,但表达式的类型为文本
此查询的 node.js 页面:
module.exports = async function(orders) {
const pool = require('./config.js');
const client = await pool.connect();
const sql = ...
const data = [
1, 1.50, 10,
2, 4.50, 11
];
client.query(sql, data).then(res => {
...
}).catch(err => console.log(err));
}
Run Code Online (Sandbox Code Playgroud)
UNION如果我从查询中删除,如下所示:
INSERT INTO account_sale
(qty, price, product_id)
SELECT $1, $2, t.id
FROM inventory_product AS t
WHERE t.ebay_sku = $3
Run Code Online (Sandbox Code Playgroud)
并从 中删除第二项data,没有任何错误。
我在这里缺少什么?
Rei*_*ica 11
要修复此错误,您需要在 select 语句中转换每列的类型:
INSERT INTO account_sale
(qty, price, product_id)
SELECT $1::integer, $2::float, t.id
FROM inventory_product AS t
WHERE t.ebay_sku = $3
UNION
SELECT $4::integer, $5::float, t.id
FROM inventory_product AS t
WHERE t.ebay_sku = $6
...
Run Code Online (Sandbox Code Playgroud)
我可以找到对此问题的最详细的解释是 @DenisdeBernardy 在这个问题中的评论:
这是由于 Postgres 强制类型的方式造成的。使用单个选择时,它将根据语句的插入部分推断类型,而使用联合时,它将根据联合的第一行推断类型,并因缺乏提示而回退到文本。