更改单个查询的NLS_SORT

时间:2015-02-06 10:41:32

标签: sql oracle oracle11g nls-sort

在通过脚本连续触发的大量查询中,单个查询使用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
  • 有没有其他方法可以让正则表达式排除变音符号而不是设置NLS_SORT?
  • 有没有办法在没有PL / SQL的情况下恢复NLS_SORT设置?

2 个答案:

答案 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');
  • 不,在没有知道或保存初始值的情况下,无法更改单个查询的NLS_SORT并将其还原。