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

Next.js Pages Router+Supabase价格筛选bug:多位数gte过滤失效

问题解决:Supabase中价格筛选(≥9999以上数值)失效的修复

问题根源

你用published_version->>price提取JSON字段时,得到的是字符串类型,而传入的minPrice是数字。字符串比较遵循字典序规则,比如字符串"11000"会被判定为小于"9999"(因为首字符"1" < "9"),导致数值筛选逻辑完全错误。

解决方案

将提取出的字符串价格强制转换为数值类型后再进行比较,修改价格筛选的代码逻辑:

修改后的代码片段

// 处理minPrice筛选
if (minPrice) {
  console.log("minPrice", minPrice);
  // 把字符串价格转为numeric类型后再比较
  query = query.gte("(published_version->>'price')::numeric", minPrice);
}

// 如果有maxPrice筛选,同理修改
if (maxPrice) {
  query = query.lte("(published_version->>'price')::numeric", maxPrice);
}

原理说明

  • published_version->>'price':从JSON字段中提取price的字符串值
  • ::numeric:PostgreSQL类型转换语法,将字符串转换为数值类型
  • 转换后,Supabase会执行数值大小比较,而非字符串字典序比较,这样11000这样的数值就能正确参与筛选。

可选优化方案

如果业务允许,建议把price字段从JSON结构中抽离,单独存储为numeric类型的数据库列:

  • 避免每次查询都要做类型转换,提升查询性能
  • 从根源上杜绝字符串/数值类型混淆的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 23:17:04