You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TypeORM查询Postgres时出现double precision语法错误

解决TypeORM搭配PostgreSQL使用MoreThanOrEqual时的类型转换报错问题

在NestJS项目中使用TypeORM操作PostgreSQL的offers表时,字段定义如下:

@Column({
    type: 'float',
    nullable: false
  })
  totalTradingAmount: number;

直接使用数值进行比较查询时可以正常运行:

offersQuery.andWhere("offers.totalTradingAmount >= CAST(:totalTradingAmount AS FLOAT)", { totalTradingAmount: 40 })

但将MoreThanOrEqual函数作为参数值传入时,会触发PostgreSQL报错:invalid input syntax for type double precision,即使把数值改为40.0也无法解决:

offersQuery.andWhere("offers.totalTradingAmount >= CAST(:totalTradingAmount AS FLOAT)", { totalTradingAmount: MoreThanOrEqual(40) })

问题原因

MoreThanOrEqual是TypeORM提供的查询条件构造器,它本身会生成包含比较运算符的SQL片段。如果把它作为参数值传给CAST函数,TypeORM会将这个函数对象序列化成字符串(比如"[object Object]"),PostgreSQL尝试将这个字符串转换为浮点数时自然会报错。

正确用法

方式一:直接使用MoreThanOrEqual构造条件(推荐)

TypeORM会根据实体字段的类型自动处理类型匹配,无需手动CAST:

// 写法1:使用字符串条件
offersQuery.andWhere("offers.totalTradingAmount >= :totalTradingAmount", {
  totalTradingAmount: MoreThanOrEqual(40)
});

// 写法2:使用对象式条件(更简洁)
offersQuery.andWhere({
  totalTradingAmount: MoreThanOrEqual(40)
});

方式二:特殊场景下手动处理类型

如果确实需要手动进行类型转换,不要将MoreThanOrEqual作为参数值,而是直接编写条件逻辑:

// 直接传入数值并手动CAST
offersQuery.andWhere(
  "offers.totalTradingAmount >= CAST(:value AS FLOAT)",
  { value: 40 }
);

// 或者结合Raw函数实现自定义条件
offersQuery.andWhere(Raw(alias => `${alias} >= CAST(:value AS FLOAT)`, { value: 40 }));

内容的提问来源于stack exchange,提问作者Faisal Anwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:42:13