【问题标题】:PostgreSQL error: column "qty" is of type integer but expression is of type textPostgreSQL 错误:列“数量”是整数类型,但表达式是文本类型
【发布时间】: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


【解决方案1】:

要修复这个错误,你需要cast 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  
...

我可以在@DenisdeBernardy 在this 问题中的评论中找到对此的解释:

这是由于 Postgres 强制类型的方式。使用单个选择,它将根据语句的插入部分推断类型,而使用联合,它将根据并集的第一行推断类型,并从缺少提示中回退到文本。

【讨论】:

  • 有趣,我不知道这个警告。不过,这似乎是一种奇怪的行为。很高兴您找到了解决方案!
猜你喜欢
  • 1970-01-01
  • 2018-10-09
  • 2015-04-22
  • 2011-12-18
  • 2015-05-30
  • 1970-01-01
  • 2018-05-04
  • 2022-08-22
  • 2016-05-15
相关资源
最近更新 更多