PostgreSQL 错误:列“qty”的类型为整数,但表达式的类型为文本

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 强制类型的方式造成的。使用单个选择时,它将根据语句的插入部分推断类型,而使用联合时,它将根据联合的第一行推断类型,并因缺乏提示而回退到文本。