用通配符

问题描述:

我想执行操作中,它试图找到相匹配的列2值与abc用通配符

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

结束但没有返回,即使有匹配的结果下面的SQL查询LIKE子句运行的PreparedStatement值。这只发生在SQL Server上。与informix数据库相同的查询返回正确的结果。任何人都知道是什么导致这种行为有所不同?

这是由于PreparedStatement为SQL Server创建SQL查询的问题吗?

编辑

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

+0

奇怪......也许它确实如此。在事先准备好的声明试试这个,注释掉了setString():'“选择列1 FROM dbo.table1 WHERE列2 LIKE‘%ABC’;”'看看会发生什么。也许它只是想在最后的分号。 – DevilsHnd

+0

@DevilsHnd,那么,如果我删除了'setString()'来解析这个值,它就会破坏防止sql注入的目的。使用分号不会改变任何内容 – sasankad

+0

这仅用于快速测试。它会像那样进入生产。 – jaxad0127

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代码的搜索字面量中没有尾随空格。

尽管作为便笺,您需要了解在开始时使用的通配符%,会对表执行全表扫描,这可能会降低查询性能。 A good文章供您以后参考。

希望这会有所帮助!

+0

它也不起作用。 – sasankad

+0

根据您最后的评论更新了我的答案,请检查并更新您的问题! –

+0

感谢您的回答。我终于找出原因。这是因为这个领域的价值观,我做了通配符搜索就有尾随空格。首先我应该检查一下。 – sasankad