Попробуйте использовать что-то вроде:
Представьте, что у вас есть таблица таких людей:
CREATE TABLE PERSONS (
PERS_ID INTEGER NOT NULL PRIMARY KEY,
LAST_NAME VARCHAR(50),
FIRST_NAME VARCHAR(50)
);
Теперь есть приложение, которое позволяет пользователю искать людей по фамилии и / или имени. Таким образом, пользователь вводит фамилию человека, которого он ищет.
Мы хотим, чтобы этот поиск не учитывал регистр, т.е. независимо от того, вводит ли пользователь «Пресли», «Пресли», «ПРЕСЛИ» или даже «Пресли», мы всегда хотим найти короля.
Ах да, и мы хотим, чтобы этот поиск был быстрым, пожалуйста. Так что должен быть индекс, ускоряющий его.
Простой способ сравнения без учета регистра состоит в том, чтобы прописать обе строки в верхнем регистре, а затем сравнить версии обеих строк в верхнем регистре.
Прописные буквы имеют ограничения, поскольку некоторые буквы не могут быть заглавными. Также обратите внимание, что есть языки / скрипты, в которых нет такой вещи, как case. Так что методика, описанная в этой статье, лучше всего подойдет для европейских языков.
Чтобы получить действительно совершенные результаты, необходимо сопоставление без учета регистра (CI) и / или без учета акцента (AI). Однако на момент написания этой статьи (июль 2006 г.) в Firebird 2.0 было только два чешских сопоставления AI / CI. Надеемся, что со временем ситуация улучшится.
(Вы должны знать концепции наборов символов и сопоставлений, чтобы понять, что будет дальше. Я использую сопоставление DE_DE
в своих примерах, это сопоставление для Германии / Германии в наборе символов ISO8859_1
.)
Чтобы получить правильные результаты от функции UPPER()
, встроенной в Firebird, вы должны указать параметры сортировки. Это может быть в определении DDL таблицы:
CREATE TABLE PERSONS (
PERS_ID INTEGER NOT NULL PRIMARY KEY,
LAST_NAME VARCHAR(50) COLLATE DE_DE,
FIRST_NAME VARCHAR(50) COLLATE DE_DE
);
или это можно сделать при вызове функции UPPER()
:
SELECT UPPER (LAST_NAME COLLATE DE_DE) FROM PERSONS;
http://www.destructor.de/firebird/caseinsensitivesearch.htm
или вы можете отредактировать свои запросы и добавить функцию lower()
LOWER()
Доступно в: DSQL, ESQL, PSQL
Добавлено в: 2.0
Описание: возвращает строчный эквивалент входной строки. Эта функция также правильно вводит строчные буквы, не являющиеся символами ASCII, даже если используется сопоставление по умолчанию (двоичное). Набор символов должен быть соответствующим, хотя: с ASCII или NONE, например, только символы ASCII в нижнем регистре; с октетами вся строка возвращается без изменений.
Тип результата: VAR(CHAR)
Синтаксис:
LOWER (str)
Важно
Если в вашей базе данных объявлена внешняя функция LOWER
, она запутает внутреннюю функцию. Чтобы сделать внутреннюю функцию доступной, УДАЛИТЕ или ИЗМЕНИТЕ внешнюю функцию (UDF).
Пример:
select field from table
where lower(Name) = 'bob'
http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-lower.html