3

在通过脚本连续触发的大量查询中,单个查询使用 REGEXP_LIKE。在其中我不希望正则表达式 ([az]) 匹配变音符号 (á, õ,ì)。我发现这样做的唯一方法是将 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 设置?
4

2 回答 2

1

好吧,如果您知道哪些 carachtes 不匹配,您可以在另一个正则表达式中隐式排除它们:

SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]') AND NOT REGEXP_LIKE('ë', '[ë]')
于 2015-02-06T11:57:58.427 回答
1

因此,感谢 Alex Poole,我重新评估了match_paramaterREGEXP_LIKE 中的选项。从文档中:

match_parameter是一个文本文字,可让您更改函数的默认匹配行为。您可以为match_parameter指定以下一个或多个值:

  • ...
  • 'c' 指定区分大小写的匹配。
  • ...

尽管区分大小写似乎不会影响 a 是否匹配 á 或 e 是否匹配 ë,但这里声明如果排序区分大小写,它也区分重音:

从 Oracle 数据库 10g 开始,Oracle 数据库为语言排序提供了不区分大小写和不区分重音的选项。它提供以下类型的单语和多语种语言类型:

  • 使用基本字母、变音符号、标点符号和大小写信息的语言分类。这些是“使用语言排序”中描述的标准单语言和多语言语言排序。
  • 使用有关基本字母、变音符号和标点符号的信息但不使用大小写的单语排序,以及使用有关基本字母和变音符号但不使用大小写或标点符号的信息的多语言排序。这种类型的排序称为不区分大小写。
  • 仅使用基本字母和标点信息的单语排序和仅使用基本字母信息的多语言排序。这种类型的排序称为不区分重音。(重音是变音符号的另一个词。)与不区分大小写的排序一样,不区分重音的排序不使用有关 case 的信息

这表明所有不区分重音的排序都是不区分大小写的,因此暗示区分大小写的排序必须区分重音。

所以,总而言之:

  • 是的,有一个更好的方法来排除变音符号:SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]', 'c');
  • 不,在不知道或保存初始值的情况下,无法更改单个查询的 NLS_SORT 并还原它。
于 2015-02-06T14:38:13.247 回答