Изменить NLS_SORT для одного запроса

В большом наборе запросов, выполняемых последовательно через скрипт, один запрос использует 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?
  • Есть ли способ восстановить настройки NLS_SORT без PL/SQL?

2 ответа

Решение

Итак, благодаря Алексу Пулу, я переоценил match_paramater опция в REGEXP_LIKE. Из документации:

match_parameter - текстовый литерал, который позволяет вам изменить поведение функции по умолчанию для соответствия. Вы можете указать одно или несколько из следующих значений для match_parameter:

  • ...
  • "c" указывает регистрозависимое соответствие.
  • ...

Хотя чувствительность к регистру, по-видимому, не влияет на совпадение совпадений или е, здесь утверждается, что если сортировка чувствительна к регистру, она также чувствительна к акценту:

Начиная с Oracle Database 10g, Oracle Database предоставляет варианты с учетом регистра и без учета акцента для лингвистических сортировок. Он обеспечивает следующие типы одноязычных и многоязычных языковых видов:

  • Лингвистические виды, которые используют информацию о базовых буквах, диакритических знаках, пунктуации и регистре. Это стандартные одноязычные и многоязычные языковые сортировки, которые описаны в разделе "Использование языковых сортировок".
  • Одноязычные сортировки, которые используют информацию о базовых буквах, диакритических знаках и пунктуации, но не регистр, и многоязычные сортировки, которые используют информацию о базовых буквах и диакритических знаках, но не регистр и знаки препинания. Этот тип сортировки называется регистрозависимым.
  • Одноязычные сортировки, которые используют информацию только о базовых буквах и знаках препинания, и многоязычные сортировки, которые используют информацию только о базовых буквах. Этот тип сортировки называется нечувствительным к акценту. (Акцент - другое слово для диакритического знака. Как и в случае нечувствительных к регистру сортировок, в нечувствительном к акценту виде не используется информация о регистре.

Это говорит о том, что все нечувствительные к акценту сортировки нечувствительны к регистру, и поэтому неявно, что сортировка с учетом регистра должна быть чувствительна к акценту.

Итак, в заключение:

  • Да, есть лучший способ исключить диакритические знаки: SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]', 'c');
  • Нет, нет способа изменить NLS_SORT для одного запроса и отменить его, не зная и не сохраняя начальное значение.

Ну, если вы знаете, какие карахты не совпадают, вы можете неявно переопределить их в другом регулярном выражении:

SELECT * FROM dual WHERE REGEXP_LIKE('ë', '[a-z]') AND NOT REGEXP_LIKE('ë', '[ë]')
Другие вопросы по тегам