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

标签 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 数据库相同的查询返回正确的结果。任何人都知道是什么导致了这种行为不同?

这是由于 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 代码的搜索文字中没有尾随空格。

尽管作为旁注,您需要了解开头使用的通配符 % 会强制对表进行全表扫描,这可能会降低查询性能。一个good文章供您将来引用。

希望这有帮助!

关于java - 使用带有通配符的 Like 子句运行PreparedStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44193345/

相关文章:

sql - * 和显式字段列表的结果不同?

java - 使用 netbeans/XAMPP 的 JDBC 驱动程序未找到 "com.mysql.jdbc.Driver"

java - 如何在 Derby 中创建缺失的数据库 View ?

java - JDBC setNetworkTimeout() 什么时候触发?

java - 为多个 Activity 创建 GoogleApiClient

sql-server - 创建新数据库时对 SQL Server Express 感到困惑

java - 用于故障转移和恢复的最佳 Kafka 生产者选项

sql - nvarchar(4001)?

java - IntentService确实广播但onReceive没有收到广播

像这样的Java图像验证码解决方案吗?