Как SQL сравнивать столбцы, когда есть символы с акцентом? - PullRequest
2 голосов
/ 16 мая 2010

У меня есть две таблицы SQLite, и я хотел бы объединить их в столбце имени. Этот столбец содержит символы с акцентом, поэтому мне интересно, как я могу сравнить их для соединения. Хотелось бы, чтобы акценты упали для сравнения на работу.

Ответы [ 4 ]

8 голосов
/ 16 мая 2010

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

EDIT: Учитывая, что кажется сомнительным, если Android поддерживает UDF и вычисляемые столбцы, вот другой подход:

  • Добавить еще один столбец в вашу таблицу, normalizedName
  • Когда ваше приложение записывает строки в вашу таблицу, оно нормализует само имя, удаляет акценты и выполняет другие изменения. Сохраняет результат в normalizedName.
  • Вы используете normalizedName в своем соединении.

Поскольку функция нормализации теперь в Java, у вас должно быть несколько ограничений в ее кодировании. Несколько примеров удаления акцентов в java приведены здесь .

4 голосов
/ 25 октября 2012

Существует простое решение, но не очень элегантное.

Используйте функцию ЗАМЕНА, чтобы убрать ваши акценты. Exemple:

SELECT YOUR_COLUMN FROM YOUR_TABLE WHERE replace(replace(replace(replace(replace(replace(replace(replace(
replace(replace(replace( lower(YOUR_COLUMN), 'á','a'), 'ã','a'), 'â','a'), 'é','e'), 'ê','e'), 'í','i'),
'ó','o') ,'õ','o') ,'ô','o'),'ú','u'), 'ç','c') LIKE 'SEARCH_KEY%'

Где SEARCH_KEY - ключевое слово, которое вы хотите найти в столбце.

1 голос
/ 16 мая 2010

Как говорит mdma, возможным решением будет пользовательская функция (UDF). Здесь есть документ , описывающий, как создать такую ​​функцию для SQLite в PHP. Вы можете написать функцию с именем DROPACCENTS(), которая удаляет все акценты в строке. Затем вы можете присоединиться к вашей колонке с помощью следующего кода:

SELECT * FROM table1
LEFT JOIN table2
ON DROPACCENTS(table1.column1) = DROPACCENTS(table2.column1)

Очень похоже на то, как вы используете функцию UCASE() для выполнения нечувствительного к регистру соединения.

Поскольку вы не можете использовать PHP на Android, вам придется найти другой способ создания UDF. Хотя уже говорилось, что создание UDF на Android невозможно, есть еще одна статья о переполнении стека, в которой утверждается, что провайдер контента может выполнить эту задачу . Последнее звучит несколько сложно, но многообещающе.

0 голосов
/ 30 ноября 2018

Сохраните специальный «нейтральный» столбец без акцентированных символов и сравните / ищите только этот столбец.

...