Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用带有通配符的Like子句运行PreparedStatement_Java_Sql Server_Jdbc_Prepared Statement_Sql Like - Fatal编程技术网

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

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数据库相同的查询返回正确的结果。有人知道是什么导致

我试图执行以下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查询的问题吗

编辑


当我执行类似操作的列中的数据包含空格时,我发现会发生这种情况。例如:当列包含“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