使用带有通配符的Like子句运行PreparedStatement

时间:2017-05-26 03:58:20

标签: java sql-server jdbc prepared-statement sql-like

我正在尝试执行以下SQL查询,它尝试查找与以abc结尾的column2值匹配的结果

 PreparedStatement stmt = conn.prepareStatement("SELECT column1 FROM dbo.table1 WHERE column2 LIKE ?");
 stmt.setString(1, "%" +"abc");

但即使存在匹配值,它也不会返回任何内容。这只发生在SQL Server上。与informix数据库相同的查询返回正确的结果。任何人都知道导致这种行为的原因是什么?

这是由于PreparedStatement如何为SQL Server创建SQL查询时出现问题吗?

修改

我发现当执行类似的列中的数据包含空格时会发生这种情况。例如:当列包含“某个单词”时,如果我通过stmt.setString(1, "%" + "word");执行搜索,它将不会返回匹配结果,但如果我对“someword”执行相同操作,则会返回匹配结果

2 个答案:

答案 0 :(得分:1)

SQL Server在单引号内的LIKE子句中接受通配符,如 ''

示例SQL查询:

SELECT NAME FROM VERSIONS WHERE NAME LIKE 'Upd%'

上面的查询将在SQL Server上产生结果。将相同的逻辑应用于Java代码也将检索PreparedStatement的结果。

PreparedStatement stmt = conn.prepareStatement("SELECT NAME FROM VERSIONS WHERE NAME LIKE ?");
stmt.setString(1, "Upd%");

我已在SQL Server 2012上测试过此代码,它对我有用。您需要确保在传递给JDBC代码的搜索文字中没有尾随空格。

虽然作为旁注,您需要了解开头使用的通配符%,会对表执行全表扫描,这会降低查询性能。一篇good文章供您日后参考。

希望这有帮助!

答案 1 :(得分:0)

我有同样的问题,为此我已经使用了CONCATE函数。

PreparedStatement ps = con.prepareStatement(
      "SELECT * FROM analysis WHERE notes like CONCAT( '%',?,'%')";
ps.setString(1, notes);
ResultSet rs = ps.executeQuery();