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