2009-05-16 4 views
30

Как написать запрос в Oracle, игнорируя случай сравнения строк? Например, «ангел», «ангел», «ангел», «ангел», «ангел» будут равны при сравнении.Как сравнить строки в sql, игнорируя регистр?

+0

выберите RPAD (a.name, 10, '=') "Номбр дель Cliente", RPAD (b.name, 12, '*') "Номбр дель Consumidor" от s_customer а, б S_region , где в .region_id = b.id И a.name LIKE '% sport%' Спорт - это то слово, которое мне нужно – 2009-05-16 03:17:42

ответ

45

Если соответствие полного значения поля используйте

WHERE UPPER(fieldName) = 'ANGEL' 

EDIT: Ваш комментарий Вы хотите использовать:

SELECT 
    RPAD(a.name, 10,'=') "Nombre del Cliente" 
    , RPAD(b.name, 12,'*') "Nombre del Consumidor" 
FROM 
    s_customer a, 
    s_region b 
WHERE 
    a.region_id = b.id 
    AND UPPER(a.name) LIKE '%SPORT%' 
+2

хочу, чтобы яг, если ответ Гэри решил вашу проблему, вы должны принять ответ. :-) –

+10

Если таблица клиентов велика, стоит рассмотреть вопрос о добавлении функционального индекса на верхний (имя) для этого типа запроса. –

9

Вы можете использовать:

select * from your_table where upper(your_column) like '%ANGEL%' 

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

select * from your_table where upper(your_column) = 'ANGEL' 

Который будет более эффективен, если вы ищете совпадение без дополнительных символов до или после your_column Поле, как предложил Гэри Рэй в своих комментариях.

+0

Согласен. Как самое сжатое. – Daniel

+0

@ PSC - Предложение where будет соответствовать только варианту «ангел» без дополнительных символов до или после того, как оно находится в поле. Если это так, то «=» более эффективно, чем «LIKE». См. Комментарий OP. –

12

Вы можете использовать ключевое слово UPPER:

SELECT * 
FROM Customers 
WHERE UPPER(LastName) = UPPER('AnGel') 
0

Я не помню точный синтаксис, но вы можете установить столбец таблицы быть чувствительны к регистру. Но будьте осторожны, потому что тогда вы больше не сможете сравниться по делу, и если вы хотите «здорово» не совпадать с «CoOl», это будет невозможно.

+0

Я не думаю, что можно установить столбец, который не учитывает регистр в Oracle. – tuinstoel

+0

Возможно, я ошибаюсь. Я знаю, что это вариант в mySql –

2

Подробнее о ответе г-на Дределя и комментариях tuinstoel. Данные в столбце будут сохранены в конкретном случае, но вы можете изменить чувствительность к регистру для соответствия.

Вы можете изменить сеанс или базу данных, чтобы использовать лингвистический или нечувствительный к регистру поиск. Вы также можете настроить индексы для использования определенных заказов сортировки.

например

ALTER SESSION SET NLS_SORT=BINARY_CI; 

После того, как вы начнете получать в неанглийские языках, с акцентами и так далее, есть дополнительная поддержка для акцента регистронезависимого. Некоторые возможности зависят от версии, поэтому ознакомьтесь с документом Globablization для вашей конкретной версии Oracle. Последний (11g) является here

3

перед сравнением двух или более строк, сначала необходимо выполнить следующие команды

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

после этих двух операторов, выполняемых тогда вы можете сравнить строки и будет случай insensitive.for примера у вас были две строки s1 = «Apple» и s2 = «apple», если вам нужно сравнить две строки перед выполнением вышеуказанных утверждений, тогда эти две строки будут обрабатываться как две разные строки, но когда вы сравните строки после выполнения два этих утверждения, то эти две строки s1 и s2 будут рассматриваться как одна и та же строка

причины для использования этих двух заявлений

Нам нужно установить NLS_COMP = лингвистический и NLS_SORT = BINARY_CI для того, чтобы использовать 10gR2 случай нечувствительность. Поскольку они являются модифицируемыми сеансом, это не так просто, как устанавливать их в параметрах инициализации.Мы можем установить их в параметрах инициализации, но они влияют только на сервер, а не на клиентскую сторону.

Смежные вопросы