Изменить 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('ë', '[ë]')