我正在尝试执行以下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”执行相同操作,则会返回匹配结果
答案 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();