运行 带通配符的 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();
我正在尝试执行以下 SQL 查询,它试图找到与以 abc
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();