csvjdbc1.0-35执行含Like模糊匹配的Where子句返回空结果问题
问题原因
- 核心原因是csvjdbc 1.0-35版本的默认LIKE语法规则和标准SQL不一致:该版本默认采用类DOS通配符规则,用
*匹配任意长度的任意字符、?匹配单个任意字符,没有将%识别为通配符。你写的Like '1%'会被解析为匹配字段值等于1%这个字面量的记录,自然返回空结果集。 - 次要排查点:如果修改通配符后依然无结果,可检查criteriaField字段的值是否存在前导空格/不可见控制字符,等于判断时你传入的匹配值可能刚好带空格匹配成功,而前缀匹配时会被前导字符阻断。
解决方案
- 直接适配默认通配符规则(改动最小)
将WHERE子句中的通配符从%替换为*即可,修改后的代码如下:
wherePhrase = " Where criteriaField Like '1*'";
该写法不需要修改其他连接配置,可直接生效。
- 启用标准SQL92 LIKE语法(兼容常用SQL习惯)
修改JDBC连接URL,增加likePattern=sql92参数开启标准SQL通配符规则,开启后%会被识别为任意长度通配符、_识别为单个字符通配符,修改后的连接代码如下:
Connection conn = DriverManager.getConnection("jdbc:relique:csv:class:" + MyHTTPReader.class.getName() + "?likePattern=sql92");
配置后你原本写的Like '1%'语句即可正常返回匹配结果。
- 字段值含前导字符的修复方案
如果排查发现是字段值存在前导空格/不可见字符,可以用trim函数清理后再匹配,示例:
wherePhrase = " Where trim(criteriaField) Like '1*'";
内容的提问来源于stack exchange,提问作者user16225638
相关产品推荐
相关产品推荐

