运行 带通配符的 Like 子句的 PreparedStatement

Running PreparedStatement with Like clause with wildcard

我正在尝试执行以下 SQL 查询,它试图找到与以 abc

结尾的 column2 值匹配的结果
 PreparedStatement stmt = conn.prepareStatement("SELECT column1 FROM dbo.table1 WHERE column2 LIKE ?");
 stmt.setString(1, "%" +"abc");

但是return即使有匹配值也没什么。这只发生在 SQL 服务器上。与 informix 数据库相同的查询 returns 正确结果。任何人都知道是什么导致这种行为不同?

这是由于 PreparedStatement 如何为 SQL 服务器创建 SQL 查询的问题吗?

编辑

我发现当我执行类似操作的列中的数据包含 space 时会发生这种情况。例如:当列包含 "some word" 时,如果我按 stmt.setString(1, "%" + "word"); 执行搜索,它不会 return 匹配结果,但如果我对 "someword" 执行相同的搜索,它会return匹配结果

SQL 服务器接受单引号内 LIKE 子句中的通配符,像这样 ''.

样本SQL查询:

SELECT NAME FROM VERSIONS WHERE NAME LIKE 'Upd%'

上面的查询将在 SQL 服务器上产生结果。将相同的逻辑应用于您的 Java 代码也会从您的 PreparedStatement 中检索结果。

PreparedStatement stmt = conn.prepareStatement("SELECT NAME FROM VERSIONS WHERE NAME LIKE ?");
stmt.setString(1, "Upd%");

我已经在 SQL Server 2012 上测试了这段代码,它适用于我。您需要确保传递给 JDBC 代码的搜索文字中没有尾随空格。

尽管作为旁注,您需要了解开头使用的通配符 % 会在 table 上强制执行完整的 table 扫描,这会降低您的查询性能.一篇 good 篇文章供您日后参考。

希望对您有所帮助!

我有同样的问题,我已经用 CONCAT 函数解决了这个问题。

PreparedStatement ps = con.prepareStatement(
      "SELECT * FROM analysis WHERE notes like CONCAT( '%',?,'%')";
ps.setString(1, notes);
ResultSet rs = ps.executeQuery();