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

问题描述 投票:3回答:3

我需要能够在多种语言中进行“喜欢”查询,以便将变音符号,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.

谢谢你的帮助!

oracle comparison sql-like diacritics case-insensitive
3个回答
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
投票

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


0
投票

这符合要求吗?

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

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

© www.soinside.com 2019 - 2024. All rights reserved.