在通过脚本连续触发的大量查询中,单个查询使用REGEXP_LIKE。在其中我不希望正则表达式([a-z])匹配变音符号(á,õ,ì)。我发现这样做的唯一方法是将NLS_SORT设置为BINARY。但是,此查询不应影响之后运行的任何其他查询。
因此,我想为此查询设置变量NLS_SORT。但是,我宁愿不诉诸PL / SQL。有没有办法实现这个目标?
我更喜欢这个,但根据我发现的文档,不存在这样的参数:
SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]', BINARY);
我可以想象这样的事情:
SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]'); -- match
ALTER SESSION SET NLS_SORT = BINARY;
SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]'); -- no match
ALTER SESSION SET NLS_SORT = DEFAULT; -- not working
ALTER SESSION RESET NLS_SORT; -- not working
答案 0 :(得分:1)
好吧,如果你知道哪些carachtes不匹配你可能隐含在另一个正则表达式中使用它们:
SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]') AND NOT REGEXP_LIKE('ë', '[ë]')
答案 1 :(得分:1)
所以,感谢Alex Poole,我重新评估了REGEXP_LIKE中的match_paramater
选项。来自documentation:
match_parameter 是一个文本文字,可让您更改函数的默认匹配行为。您可以为 match_parameter 指定以下一个或多个值:
- ...
- 'c'指定区分大小写的匹配。
- ...
虽然区分大小写似乎不会影响匹配á或e是否匹配ë,但here表示如果排序区分大小写,则它也是重音敏感的:
从Oracle数据库10g开始,Oracle数据库为语言排序提供了不区分大小写和不区分重音的选项。它提供以下类型的单语和多语言语言种类:
- 使用有关基本字母,变音符号,标点符号和大小写的信息的语言分类。这些是“使用语言排序”中描述的标准单语和多语言语言种类。
- 单语排序,使用有关基本字母,变音符号和标点符号的信息,但不是大小写,以及使用有关基本字母和变音符号的信息的多语言排序,但不包括大小写或标点符号。这种类型的排序称为不区分大小写。
- 单语排序,仅使用有关基本字母和标点符号的信息,以及仅使用有关基本字母信息的多语言排序。这种类型的排序称为不区分重音。 (重音是变音符号的另一个词。)与不区分大小写的排序类似,不区分重音的排序不使用有关大小写的信息。
这表明所有不区分重音的排序都不区分大小写,因此隐式地区分大小写的排序必须是重音敏感的。
所以,最后:
SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]', 'c');