Witaj, staram się wdrożyć kilka prostych zapytań Oracle i testowałem użycie regexp_count.

Wpadłem w ten dziwny przypadek, kod:

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

Zwraca to 3 (1 mecz na znak), gdy powinien zwrócić 0. Wydaje się, że ignoruje flagę "C" (czułość przypadku) i dopasowując "O" jako "O".

enter image description here

Czy to jest zamierzone zachowanie, czy czegoś brakuje?

0
João Ramiro 14 październik 2020, 14:18

1 odpowiedź

Najlepsza odpowiedź

Biegać:

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

I zobacz, jakie parametry sesji NLS używasz.

Na przykład:

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;

Wyjścia:

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

Ale:

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;

Wyjścia:

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

Aby to naprawić, możesz:

  • Zmień parametr sesji NLS_SORT.
  • Lub (jak wspomniano @alexpoole), użyj zestawu znaków [:lower:] zamiast a-z.

DB & LT; & GT; Fiddle Oto

4
MT0 14 październik 2020, 12:19