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
相关产品推荐
相关产品推荐

