Java 使用带有通配符的Like子句运行PreparedStatement
我试图执行以下SQL查询,其中它试图查找与以Java 使用带有通配符的Like子句运行PreparedStatement,java,sql-server,jdbc,prepared-statement,sql-like,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数据库相同的查询返回正确的结果。有人知道是什么导致
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查询的问题吗
编辑
当我执行类似操作的列中的数据包含空格时,我发现会发生这种情况。例如:当列包含“someword”时,如果我通过stmt.setString(1,“%”加“word”)执行搜索
它不会返回匹配结果,但如果我对“someword”执行相同的操作,它将返回匹配结果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%");
我已经在SQLServer2012上测试了这段代码,它对我很有用。您需要确保传递给JDBC代码的搜索文本中没有尾随空格
尽管作为旁注,您需要了解,开头使用的通配符%
会强制对表进行完整的表扫描,这可能会降低查询性能。一篇文章供你将来参考
希望这有帮助 我也有同样的问题,我已经为此使用了CONCATE函数
PreparedStatement ps = con.prepareStatement(
"SELECT * FROM analysis WHERE notes like CONCAT( '%',?,'%')";
ps.setString(1, notes);
ResultSet rs = ps.executeQuery();
奇怪……也许是这样。在准备好的语句中尝试这一点,并注释掉setString():“从dbo.table1中选择column1,其中column2类似于“%abc”;”
,然后查看发生了什么。也许它只是想在末尾加上分号。@DevilsHnd,如果我删除setString()
来解析值,它就无法阻止sql注入。使用分号不会改变任何事情这只是为了快速测试。它会像那样投入生产。根据您最后的评论更新了我的答案,请检查并更新您的问题代码!谢谢你的回答。我终于找到了原因。这是因为字段中的值,我进行的通配符搜索有尾随空格。我应该先检查一下。很高兴帮助@sasankad