Oracle DB: Как я могу написать запрос, игнорируя регистр?

Как я уже писал в заголовке, у меня есть SQL-запрос, запущенный на базе данных Oracle, скажем:

SELECT * FROM TABLE WHERE TABLE.NAME Like 'IgNoReCaSe'

Если бы я хотел, чтобы запрос возвращал либо "IGNORECASE", "ignorecase", либо их комбинации, как это можно сделать?

Это возможно?

9 ответов

Решение

Вы можете использовать операторы ALTER SESSION, чтобы установить сравнение без учета регистра. Смотрите этот FAQ.

alter session set NLS_COMP=ANSI;
alter session set NLS_SORT=BINARY_CI;

Для всех тех, кто посетил 8 лет после того, как был принят этот оригинальный ответ (для 10gR2):

После 10gR2, NLS_COMP настройка должна быть `ЯЗЫКОВОЙ ':

ALTER SESSION SET NLS_COMP=LINGUISTIC;
Select * from table where upper(table.name) like upper('IgNoreCaSe');

В качестве альтернативы, заменить нижний на верхний.

Вы можете использовать либо нижнюю, либо верхнюю функцию с обеих сторон условия where

Вы также можете использовать регулярные выражения:

SELECT * FROM TABLE WHERE REGEXP_LIKE (TABLE.NAME,'IgNoReCaSe','i');

Вы можете использовать функцию upper() в своем запросе, а для повышения производительности вы можете использовать базовый индекс функции.

 CREATE INDEX upper_index_name ON table(upper(name))

Вы можете преобразовать оба значения в верхний или нижний регистр, используя upper или же lower функции:

Select * from table where upper(table.name) like upper('IgNoreCaSe') or lower(table.name) like lower('IgNoreCaSe');

В версии 12.2 и выше самый простой способ сделать запрос нечувствительным к регистру:

      SELECT * FROM TABLE WHERE TABLE.NAME COLLATE BINARY_CI Like 'IgNoReCaSe'

... также выполнить преобразование в верхнюю или нижнюю часть запроса:

tableName:= UPPER(someValue || '%');

...

Select * from table where upper(table.name) like tableName 

Также не забывайте очевидное, должны ли данные в таблицах иметь регистр? Вы можете только вставить строки, уже в нижнем регистре (или преобразовать существующие строки БД в нижний регистр) и сделать это с самого начала.

Другие вопросы по тегам