【问题标题】:REGEXP_COUNT ignoring case sensitivityREGEXP_COUNT 忽略区分大小写
【发布时间】:2020-10-14 11:18:02
【问题描述】:

您好,我正在尝试实现一些简单的 oracle 查询,并且正在测试 regexp_count 的用法。

我遇到了这个奇怪的案例,代码:

select regexp_count('OOO', '[a-z0-9]', 1,'c') from dual;

这返回 3(每个字符 1 个匹配项),而它应该返回 0。似乎它忽略了标志 'c'(区分大小写),并将 'O' 匹配为 'o'。

这是预期的行为还是我遗漏了什么?

【问题讨论】:

  • 这适用于 dbfiddle: dbfiddle.uk/….
  • 您确定您的模式是 not '[a-zA-Z0-9]' ,或者该值包含 三个零 而不是三个字母“O” .. ? (它工作正常)
  • 到底是什么我的预言机配置错误,我使用的是 12.2.0.1.0 不确定是否重要@GordonLinoff
  • @BarbarosÖzhan 那是确切的 qeury,它一定是我的 oracle 上的一些错误配置
  • 您使用的是什么语言环境,您的会话中的 NLS_SORT 设置是什么? 'c' 匹配参数可能会使其无关紧要,但仍然......您可以通过使用 '[[:lower:]0-9]''[[:lower:][:digit:]]' 来避免此问题,并且在这种情况下可能不需要 'c'。

标签: sql regex oracle


【解决方案1】:

运行:

SELECT *
FROM   NLS_SESSION_PARAMETERS
WHERE  parameter IN ( 'NLS_COMP', 'NLS_SORT' );

并查看您使用的 NLS 会话参数。

例如:

ALTER SESSION SET NLS_COMP=BINARY;
ALTER SESSION SET NLS_SORT=BINARY;
SELECT regexp_count('OOO', '[a-z0-9]', 1, 'c' ) AS COUNT_AZ,
       regexp_count('OOO', '[[:lower:][:digit:]]', 1, 'c' ) AS count_lower
FROM   DUAL;

输出:

COUNT_AZ | COUNT_LOWER --------: | ----------: 0 | 0

但是:

ALTER SESSION SET NLS_COMP=ANSI;
ALTER SESSION SET NLS_SORT=GERMAN_AI;
-- or ALTER SESSION SET NLS_SORT=GERMAN_CI;
-- or ALTER SESSION SET NLS_SORT=FRENCH_CI;
-- or many others
SELECT regexp_count('OOO', '[a-z0-9]', 1, 'c' ) AS COUNT_AZ,
       regexp_count('OOO', '[[:lower:][:digit:]]', 1, 'c' ) AS count_lower
FROM   DUAL;

输出:

COUNT_AZ | COUNT_LOWER --------: | ----------: 3 | 0

要解决此问题,您可以:

  • 更改NLS_SORT 会话参数。
  • 或者(如@AlexPoole 所述)使用[:lower:] POSIX 字符集而不是a-z

db小提琴here

【讨论】:

  • 谢谢,我的 NLS_SORT 是 Western_European,将其更改为 BINARY 即可解决!非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多