2010-11-18 97 views

回答

4

好听的,你可以这样做

select upper(convert('This is a têst','US7ASCII')), 
     upper(convert('THIS is A test','US7ASCII')) 
from dual; 

select 1 from dual 
where upper(convert('This is a têst','US7ASCII')) = 
      upper(convert('THIS is A test','US7ASCII')) 

CONVERT将重音字符缩小为映射的ASCII等效字符,并且UPPER强制将小写字母改为大写字母。结果字符串应该匹配。

+0

这不是JPA兼容(NO转化的支持),但它会工作中使用Hibernate/ORACLE所以我接受这个答案......希望不要不公平:) – AlfaTeK 2010-11-19 16:52:39

+0

'不公平'或'错误'? =)您使用JPA请求了答案,并接受了与JPA不兼容的答案。 – 2016-07-25 00:05:43

8

(...)使用JPA,我该如何强制类似的查询不区分大小写且不区分重音?

我的答案是面向JPQL的。对于前一部分,你可以这样做:

where lower(name) like 'johny%'; 

对于后面的部分,我不知道一个标准的JPQL方式来做到这一点。

最后,改变会话变量NLS_COMPNLS_SORT是IMO的最佳选择。

-1

你可以使用NLS_UPPER对于不改变会话:

select 1 
from dual 
where nls_upper('große', 'NLS_SORT = XGerman') like '%OSSE%'; 

NLS_UPPER documentation

+0

这并不能解决不区分重音的问题。 SELECT NLS_UPPER('áçgroe','NLS_SORT = XWEST_EUROPEAN_AI')“Uppercase”FROM DUAL; //返回仍然具有重音符号的GROE – AlfaTeK 2010-11-19 16:46:09

+0

我没有查看NLS_SORT参数的所有可能值。我想应该有一个消除口音。我会在周末之后看看是否可以添加任何有用的东西。 – 2010-11-19 18:40:05