如何在MariaDB存储过程中结合参数使用通配符
问题:MariaDB存储过程中LIKE前缀匹配失效
我有一个用于统计查询结果的存储过程,包含2个输入参数:一个需精确匹配,另一个只需匹配以指定值开头的内容。存储过程代码如下:
CREATE OR REPLACE PROCEDURE CandidateCount(IN param_pack VARCHAR(64), IN param_value VARCHAR(64), OUT result INTEGER) BEGIN SELECT COUNT(*) INTO result " + conditions + " LIMIT 1; END
Java中拼接查询条件的代码如下,其中精确匹配逻辑正常,但两个LIKE前缀匹配的语句无法生效:
String conditions = " FROM Product WHERE "; conditions += "PackageName = RTRIM(param_pack)"; // 正常工作 conditions += " AND ("; conditions += "ProductNumber = RTRIM(param_value)"; // 正常工作 conditions += " OR "; conditions += "ProductNumber LIKE RTRIM(param_value) + '%'"; // 不生效 conditions += " OR "; conditions += "ProductName LIKE RTRIM(param_value) + '%'"; // 不生效 conditions += ")";
我使用JDBC连接MariaDB 10.3数据库,尝试过相关方案但无语法警告却无法生效。
解决方案
核心问题:字符串拼接语法错误
MariaDB(属于MySQL生态)不支持用+做字符串拼接,这是SQL Server专属语法。需要改用MariaDB原生的CONCAT()函数来拼接前缀值和通配符%。
修改后的条件拼接代码
String conditions = " FROM Product WHERE "; conditions += "PackageName = RTRIM(param_pack)"; conditions += " AND ("; conditions += "ProductNumber = RTRIM(param_value)"; conditions += " OR "; conditions += "ProductNumber LIKE CONCAT(RTRIM(param_value), '%')"; // 修正拼接语法 conditions += " OR "; conditions += "ProductName LIKE CONCAT(RTRIM(param_value), '%')"; // 修正拼接语法 conditions += ")";
更优方案:直接在存储过程中编写完整SQL(避免Java拼接,更安全)
把查询逻辑直接写到存储过程里,既规避Java字符串拼接的语法问题,还能降低SQL注入风险:
CREATE OR REPLACE PROCEDURE CandidateCount(IN param_pack VARCHAR(64), IN param_value VARCHAR(64), OUT result INTEGER) BEGIN SELECT COUNT(*) INTO result FROM Product WHERE PackageName = RTRIM(param_pack) AND ( ProductNumber = RTRIM(param_value) OR ProductNumber LIKE CONCAT(RTRIM(param_value), '%') OR ProductName LIKE CONCAT(RTRIM(param_value), '%') ) LIMIT 1; END
内容的提问来源于stack exchange,提问作者Guido Wolff
相关产品推荐
相关产品推荐

