SQL查询LIKE子句如何使用占位符?预编译语句问号写法是否可行
结论
你写的'?%?'写法不能正常生效,不可以这么用。
原因说明
- 预编译语句的
?占位符不能被包裹在单引号内部:被单引号包裹的所有内容都会被数据库解析为普通字符串字面量,写'?%?'的话数据库会把它当成「以问号开头、中间包含任意字符、以问号结尾」的匹配规则,不会把?识别为需要替换的参数占位符。
正确实现方案
对应你原本':name%:id'的匹配需求(即匹配「第一个参数值开头 + 任意字符 + 第二个参数值结尾」的规则),有两种通用的实现方式:
方案1:SQL层面用拼接函数(推荐,兼容性最好)
直接在SQL语句中通过数据库原生函数拼接参数和通配符:
select * from Table1 where Identifier = 'ABC' and Identifier_Type like CONCAT(?, '%', ?)
按顺序传入两个参数即可,不需要额外处理参数值,MySQL、PostgreSQL、SQL Server、Oracle等主流数据库都支持CONCAT函数。
方案2:业务代码侧拼接参数
SQL中只保留单个占位符:
select * from Table1 where Identifier = 'ABC' and Identifier_Type like ?
在代码层传入参数前,自行把值拼接为第一个参数值 + "%" + 第二个参数值的格式再传入即可。
内容的提问来源于stack exchange,提问作者Charu
相关产品推荐
相关产品推荐

