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

PostgreSQL中jsonb的减号运算符能否使用参数而非硬编码值?

问题原因

核心是参数类型和PostgreSQL运算符预期不匹配。
PostgreSQL 中jsonb类型的-运算符有两套匹配逻辑:

  • 右操作数为整数时:删除jsonb数组中对应下标的元素
  • 右操作数为字符串时:删除jsonb对象中对应键名的键值对

你代码里把findIndex返回的数字下标调用了.toString()转成了字符串类型,传入数据库后PostgreSQL会认为你要删除json对象的指定key,而你的games字段是数组类型,自然没有匹配的操作结果,所以没有数据被删除。硬编码写1的时候PostgreSQL默认识别为整数类型,符合数组下标删除的逻辑,所以能正常执行。

解决方法
  1. 直接删除.toString()调用,传入数字类型的下标即可:
// 去掉.toString(),直接保留数字类型
const gameIndex = rowsCopy[0].games.findIndex(obj => obj.game == gameID);

const deleteGameQuery = ` 
    update users 
    set games = games - $1
    where username = $2
`
const { rows } = await query(deleteGameQuery, [gameIndex, username]);
  1. 如果担心驱动自动类型转换有问题,可以在SQL中显式强转参数为整数:
update users 
set games = games - $1::int
where username = $2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:30:03