Oracle DB: как я могу написать запрос, игнорирующий случай?
Как я написал в заголовке, у меня есть SQL-запрос, запускаемый на базе Oracle DB, скажем:
SELECT * FROM TABLE WHERE TABLE.NAME Like 'IgNoReCaSe'
Если бы я хотел, чтобы запрос возвращал либо "IGNORECASE", "ignorecase", либо их комбинации, как это можно сделать?
Возможно ли это?
Ответы
Ответ 1
Вы можете использовать операторы 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;
Ответ 2
Select * from table where upper(table.name) like upper('IgNoreCaSe');
Альтернативно, замените нижний верхний.
Ответ 3
Вы можете использовать либо нижнюю, либо верхнюю функцию с обеих сторон условия where
Ответ 4
Вы также можете использовать регулярные выражения:
SELECT * FROM TABLE WHERE REGEXP_LIKE (TABLE.NAME,'IgNoReCaSe','i');
Ответ 5
Вы можете использовать функцию upper() в вашем запросе, а для повышения производительности вы можете использовать индекс функциональной базы
CREATE INDEX upper_index_name ON table(upper(name))
Ответ 6
Вы можете преобразовать оба значения в верхний или нижний регистр, используя функции upper
или lower
:
Select * from table where upper(table.name) like upper('IgNoreCaSe')
или
Select * from table where lower(table.name) like lower('IgNoreCaSe');
Ответ 7
... также выполняет преобразование в верхнюю или нижнюю часть запроса:
tableName:= UPPER(someValue || '%');
...
Select * from table where upper(table.name) like tableName
Ответ 8
Кроме того, не забывайте о том, что нужно делать данные в таблицах? Вы можете вставлять строки уже в нижнем регистре (или преобразовывать существующие строки БД в нижний регистр) и делать это с самого начала.