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

