Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Другие предикаты сравнения
Другие предикаты сравнения
Предикаты BETWEEN, CONTAINING, LIKE и STARTING WITH, представленные в табл. 21.5, имеют одинаковый приоритет при вычислениях в операторах сравнения, описанных
в табл. 21.4. Если они конфликтуют друг с другом, то вычисление осуществляется строго слева направо.
Таблица 21.5. Другие предикаты сравнения
Предикат |
Назначение |
BETWEEN ... AND ... |
Значение попадает во включающий диапазон значений |
CONTAINING |
Строковое значение содержит указанную строку. Сравнение является независимым от регистра |
IN |
Значение присутствует в указанном наборе* |
LIKE |
Равенство указанной строке с шаблонными подстановками |
STARTING WITH |
Строковое значение начинается с указанной строки |
* Наиболее эффективной является ситуация, когда набор содержит небольшое количество констант. Набор не может превышать 1500 элементов. (См. разд. "Предикаты существования".)
BETWEEN использует два аргумента совместимых типов, разделенных ключевым словом AND. Меньшее значение должно быть первым аргументом, если нет, не найдет ни одной строки, соответствующей предикату. Поиск является включающим - то есть значения, соответствующие обоим аргументам, будут включены в возвращаемый набор, например:
SELECT * FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '01.01.1992' AND CURRENT_TIMESTAMP;
BETWEEN будет использовать возрастающий индекс по искомому столбцу, если таковой доступен.
CONTAINING ищет строку или тип, подобный строке, отыскивая последовательность символов, которая соответствует его аргументу. Он может быть использован для алфавитно-цифрового (подобного строковому) поиска в числах и датах. Поиск CONTAINING является чувствительным к регистру.
Следующий пример
SELECT * FROM PROJECT
WHERE PROJ_NAME CONTAINING ' Map ' ;
возвращает две строки проекта: 'AutoMap' и 'MapBrowser port'. Следующий пример
SELECT * FROM SALARY_HISTORY
WHERE CHANGE_DATE CONTAINING 93;
возвращает все строки, где датой является год 1993.
! ! !
ВНИМАНИЕ! В некоторых релизах CONTAINING является непредсказуемым, когда используется для BLOB, чей размер больше 1024 байт. Это определено как ошибка и будет вскоре исправлено в следующем после 1.5 релизе.
. ! .
IN принимает в качестве аргумента список значений и возвращает все строки, где значение столбца в левой части равно любому значению в множестве, например:
SELECT * FROM EMPLOYEE
WHERE FIRST_NAME IN('Pete', 'Ann', 'Roger');
NULL не может быть включен в множество поиска.
Список аргументов в IN о может быть представлен в виде подзапроса, который возвращает строки, состоящие из одного столбца. Подробности см. в разд. "Предикаты существования" далее в этой главе.
! ! !
ВНИМАНИЕ! Общей ошибкой "чайников" является трактовка предиката IN (<значение>) как если бы он был эквивалентным предикату =<значение>, потому что оба предиката логически эквивалентны в том смысле, что оба возвращают один и тот же результат. При этом IN не использует индексы. Поскольку среди равных поисков обычно лучшим является тот, который оптимизирован по индексу, использование IN является плохим решением с точки зрения производительности.
. ! .
LIKE является чувствительным к регистру шаблоном оператора поиска. Это довольно тупой инструмент, выполняющий сравнение с шаблоном поиска в обычном выражении. Он распознает два шаблонных символа: % и _ (символ подчеркивания), которые работают следующим образом.
* Символ % может быть подставлен в строку поиска для представления любого количества любых символов, в том числе и нулевого количества, например:
LIKE '%mit%'
вернет истину для таких строк, как 'blacksmith', 'mitgenommen', а также и 'mit'.
* Символ подчеркивания (_) может быть вставлен в строку поиска для представления одного неопределенного символа. Например, следующее условие задает поиск записей, где фамилия может быть 'Smith', 'Smyth' или другой, похожей на шаблон:
LIKE 'Sm_th'
Если вам нужно отыскать строку, которая содержит один или оба шаблонных символа в литерале шаблона, вы можете "отменить" символ литерала- то есть отметить его символом, который предшествует специальному отменяемому символу.
Например, скажем, вам нужно использовать оператор LIKE для поиска всех имен системных таблиц. Предположим, что все имена системных таблиц содержат, по меньшей мере, один символ подчеркивания- а это почти правда! Вы решили использовать символ # в качестве символа отмены. Вот что вам нужно сделать:
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE RDB$RELATION_NAME LIKE '%#_%' ESCAPE '#';
Поиски LIKE не используют индекс. При этом предикат, использующий LIKE 'ваша строка%', будет преобразован в предикат STARTING WITH, который будет использовать индекс, если тот доступен.
Предикаты STARTING WITH являются чувствительными к регистру. Они используют правила соответствия байтов применяемого набора символов и последовательности сортировки. При необходимости они могут использовать аргумент COLLATION для поиска с применением конкретной последовательности сортировки.
Следующий пример
SELECT LAST_NAME, FIRST_NAME FROM EMPLOYEE
WHERE LAST_NAME STARTING WITH 'Jo';
вернет строки, где фамилиями будут ' Johnson', ' Jones ', ' Joabim' и др.
В базе данных, хранящей в строковых столбцах тексты на немецком языке, где набор символов по умолчанию ISO8859_1, вам может понадобиться преобразовать последовательность сортировки, например:
SELECT FAM_NAME, ERSTE_NAME FROM ARBEITNEHMER
WHERE COLLATE DE_DE FAM_NAME STARTING WITH ' Schmi ' ;
STARTING WITH будет использовать индекс, если он доступен.
- Другие объекты подсистемы VFS
- 6. Навигация и другие аспекты человекоориентированных интерфейсов
- Другие
- Операторы сравнения
- Другие игры
- Другие среды разработки
- ДРУГИЕ УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ: break, continue, goto
- Другие ресурсы
- Другие способы клиентской оптимизации
- 8. Циклы и другие управляющие средства
- Другие инструменты для осуществления резервного копирования
- Другие изменения в 7-й версии InterBase