【发布时间】:2019-09-02 10:25:08
【问题描述】:
下面的查询是根据插入的行数动态生成的。对于每一行数据,都有一个额外的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
...
当我尝试运行查询时,我得到以下信息:
错误:列“数量”是整数类型,但表达式是文本类型
此查询的 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));
}
如果我从查询中删除UNION,如下所示:
INSERT INTO account_sale
(qty, price, product_id)
SELECT $1, $2, t.id
FROM inventory_product AS t
WHERE t.ebay_sku = $3
并从data 中删除第二项,没有任何错误。
我在这里错过了什么?
【问题讨论】:
-
你能显示你设置查询参数的代码吗?您用作参数的数据类型似乎存在问题。
-
@VictorP 代码本身大约有 100 行。它涉及对 ebay 的服务器进行 api 调用,然后解析响应。我发布的
orders数据是在执行查询之前参数console.log的结果,所以应该是准确的。 -
我不确定您是否复制/粘贴了生成的确切 sql 或订单数组,因为您在此处发布的内容看起来不错。也许你在某处遗漏了一个逗号,它正在改变参数?
-
@VictorP 我想通了。正在努力发布答案,但我不确定我是否完全理解。我必须在 UNION select 语句之后对列使用 typecasting。
标签: sql node.js postgresql casting