【问题标题】:How can I specify a case insensitive search in Java如何在 Java 中指定不区分大小写的搜索
【发布时间】:2016-04-01 05:03:42
【问题描述】:

我目前有这个代码:

query = "select ID_OBJECT from "+Config.props.getProperty("Ob.SchemaName.Objects")+".sdm_doc_info where name like ? and typefileverscurr = 'DWG'";    

但是,这只返回匹配大写 DWG 的结果。 我希望我的搜索不区分大小写。 在这种情况下如何使用 ?i ? 我尝试了以下方法,但我的 Eclipse 不喜欢它:

query = "select ID_OBJECT from "+Config.props.getProperty("Ob.SchemaName.Objects")+".sdm_doc_info where name like ? and typefileverscurr.matches('(?i:dwg)')";

感谢您的帮助。

【问题讨论】:

  • 如果您能指定数据库的类型(DB2、MySQL、Oracle 等)会有所帮助。
  • 这真的和Java无关;这是一个 SQL 问题。我添加了一个标签。
  • 我认为您的答案是特定于数据库的。例如,默认情况下 MySQL 附带区分大小写的排序规则,因此 MySQL 不会出现这个问题。 Oracle 和 SQL Server 是另一回事。
  • 请使用您的确切 RDBMS 进行标记。
  • 对混淆表示歉意。此查询是我的 java 代码的一部分。我正在查询一个 Oracle SQL 数据库。

标签: java sql case-insensitive


【解决方案1】:

通常我用两种方式来完成这类工作,一种是使用 SQL upper()lower() 函数,如下所示:

"select ID_OBJECT from "+something+".sdme_doc_info where lower(typefileverscurr) = 'dwg'";

"select ID_OBJECT from "+something+".sdme_doc_info where upper(typefileverscurr) = 'DWG'";

另一种方法是在查询中使用like 并混合上述函数以使其更加不敏感

"select ID_OBJECT from "+something+".sdme_doc_info where lower(typefileverscurr) like '%dwg%'";

"select ID_OBJECT from "+something+".sdme_doc_info where upper(typefileverscurr) like '%DWG%'";

【讨论】:

  • 他最好通过更改排序规则在数据库中处理这个问题。
  • 是的,你是对的,他也没有指定数据库。
  • 我也尝试过类似上面的方法,但是它对系统性能的影响相当大,因为它必须执行两次搜索。我正在寻找可以执行类似谓词的搜索的东西,它对提供的字符串不区分大小写。
  • 为防止这种情况发生,您必须确保将数据存储在仅小写或仅大写的数据库中。你会得到一些技巧来使用类似的查询,以及在mysql的情况下参见here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 2013-09-26
  • 2023-03-20
相关资源
最近更新 更多