案例和重音不敏感'喜欢'比较oracle而不改变oracle上的会话

时间:2010-09-16 02:52:48

标签: oracle comparison sql-like diacritics case-insensitive

我需要能够跨多种语言进行'喜欢'查询,以便将变音符号,a和A视为相同,依此类推。我在oracle的10gr2上,我无法改变会话。

我一直在尝试像

这样的事情
nls_upper(col_name,'NLS_SORT=BINARY_AI') like nls_upper('%fur%','NLS_SORT=BINARY_AI')
但是我没有任何快乐。无论我做什么,nls_upper的结果似乎都保留了U上的变音符号。

我可以使用任何功能或操作员吗?理想情况下,它还会将德语eszett(看起来像B的有趣角色)转换为双S。

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

所以实际上似乎最好的解决方案是将两个字符串转换为US7ASCII,因为它会删除所有重音符号。所以我可以这样做:

upper(convert(col_name,'US7ASCII'))like upper(convert('%okopla%','US7ASCII'))

我发现的唯一的皱纹就是德国的eszett被转换成了?所以我只想查看我的搜索词,如果它包含一个有趣的B,那么我将使用Gary的NLS_UPPER('große','NLS_SORT = XGerman'),否则我只会转换为ASCII。这是一个小小的kludgy,但我们只需要涵盖英语,法语和德语,所以我认为它会没问题。

感谢您的帮助

答案 1 :(得分:1)

根据Oracle documentation,您需要同时指定NLS_COMP = LINGUISTIC和NLS_SORT = XGERMAN_AI,它们都是变音符号和Eszett不敏感的。我想你必须用replace()手动替换Eszetts。

答案 2 :(得分:0)

这是否符合要求?

select case when NLS_UPPER ('große', 'NLS_SORT = XGerman') 
                     like '%SS%' then 'YES' else 'no' end match
from dual;

如果没有,你必须详细说明要求。