用通配符
问题描述:
我想执行操作中,它试图找到相匹配的列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”执行相同操作,它将返回匹配结果
答
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文章供您以后参考。
希望这会有所帮助!
奇怪......也许它确实如此。在事先准备好的声明试试这个,注释掉了setString():'“选择列1 FROM dbo.table1 WHERE列2 LIKE‘%ABC’;”'看看会发生什么。也许它只是想在最后的分号。 – DevilsHnd
@DevilsHnd,那么,如果我删除了'setString()'来解析这个值,它就会破坏防止sql注入的目的。使用分号不会改变任何内容 – sasankad
这仅用于快速测试。它会像那样进入生产。 – jaxad0127