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

MariaDB存储过程IN()语句多参数传递异常问题及解决

解决MariaDB存储过程传入多个portfolio_id仅第一个生效的问题

问题场景

  • 基于MariaDB 10.9.4编写的tradeResults存储过程,用于跨多表汇总交易数据
  • 传入单个portfolio_id时,存储过程执行正常,返回对应数据
  • 传入逗号分隔的多个ID(如'128,131')时,仅第一个ID对应的数据被返回;调换ID顺序后,返回结果也只匹配新的第一个ID

问题根源

原实现中使用IN()语句处理多ID参数,但当参数是字符串格式的逗号分隔值时,MariaDB会将整个字符串当作单个数值处理(自动转换为第一个数字部分),导致IN()条件实际只匹配了第一个ID,而非预期的多个ID集合。

修复方案

将存储过程的参数类型改为JSON,通过JSON_CONTAINS()函数替代IN()语句,实现正确的多ID匹配:

  • 调整参数类型:把原存储过程的字符串类型参数改为JSON类型
  • 修改查询条件:将原WHERE portfolio_id IN (p_portfolio_id)替换为WHERE JSON_CONTAINS(p_portfolio_id, CAST(portfolio_id AS JSON))
  • 更新调用方式:传入JSON数组格式的参数,例如'[131,128]'

代码示例

修改后的存储过程

CREATE PROCEDURE tradeResults(IN p_portfolio_id JSON)
BEGIN
  -- 保留原有跨表查询逻辑,仅替换WHERE条件
  SELECT 
    t.*, p.portfolio_name
  FROM trade_records t
  JOIN portfolios p ON t.portfolio_id = p.id
  WHERE JSON_CONTAINS(p_portfolio_id, CAST(t.portfolio_id AS JSON));
END;

调用存储过程

CALL tradeResults('[131,128]');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:17:07