2016-02-28 11 views
3

Я хотел бы знать, есть ли простой способ сравнить два текстовых значения, игнорируя акценты и верхний регистр. Im работает с базой данных Oracle. Я уже искал ответ, но, честно говоря, я не понимаю, что они предложили здесь Accent and case insensitive collation in Oracle with LIKE. Я попробовал, и это не сработало для меня. В основном все, что я хочу сделать, это сравнить с текстовыми значениями, такими как «pepé» и «pepe», и получить true в качестве ответа.Сравнение строк, игнорирующих акценты в SQL (ORACLE)

можно ли это сделать без инструкции LIKE?

Спасибо! Настройка

+0

Вы пытаетесь сравнить строки для равенства, игнорируя случай и акценты? Или сделать сравнение «LIKE» между ними, игнорируя случай и акценты? Установка 'nls_sort' и' nls_comp' в качестве ответа, связанного с предложениями, как представляется, решит вашу проблему. Можете ли вы объяснить, что вы не понимаете? Вы пытались запустить два оператора 'alter session'? Разве это не сработало? –

+0

@ JustinCave в основном то, что я хочу сделать, это сделать Присоединение по имени города, но в данных, которые у меня есть один и тот же город, иногда появляются с акцентом, а иногда нет, поэтому он распознает их как два разных города. Я не могу изменить данные. – Tiasn

+0

Вы пытались установить 'nls_sort' и' nls_comp' в свой сеанс и выполнить запрос? Казалось бы, это выполнит то, что вы хотите, и в этом случае это дубликат вопроса, который вы определили. Если это не решит проблему, можете ли вы помочь нам понять, что конкретно не работает для вас? –

ответ

4

Oracle:

CREATE TABLE TABLE_NAME (value) AS 
SELECT 'pepé' FROM DUAL; 

-- Not necessary to create an index but it can speed things up. 
CREATE INDEX value_without_accent_idx 
    ON TABLE_NAME (CONVERT(value, 'US7ASCII')); 

Запрос:

SELECT * 
FROM table_name 
WHERE CONVERT(value, 'US7ASCII') = 'pepe'; 

Выход:

VALUE 
----- 
pepé 
+0

Благодарим вас за ответ, но я консультирую пользователя, у которого нет прав на создание таблиц, чтобы проконсультироваться с ними. Как я могу это сделать без изменения конфигурации или создания таблиц? – Tiasn

+1

Просто используйте запрос в соответствующей таблице (без индекса). Индекс не нужен, так как он просто предварительно вычисляет преобразованные значения, если быстрее генерировать результаты - если вы не можете этого сделать, то он будет работать, но только медленнее. – MT0

2

использовать nlssort функция следующим образом:

select * from <your_table> where utl_raw.cast_to_varchar2((nlssort(<inspected_column>, 'nls_sort=binary_ai'))) like 'pe%'; 

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

Оригинальный источник: this article (проверено на 12c).