Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Топовые новости
Новое

Оператор LIKE cоветы и хитрости программирования

Польза предложения LIKE основывается на поддерживаемых им обобщающих операторах. Предложение LIKE возвращает булево значение ИСТИНА, если при сравнении обнаруживаются совпадающие значения.

Для функционирования предложения LIKE очень важна чувствительность к регистру конкретной СУБД. Например, Microsoft SQL Server по умолчанию не учитывает регистр (хотя его можно настроить соответствующим образом). Таким образом, SQL Server будет считать строки DAD и dad одинаковыми. С другой стороны, платформа Oracle учитывает регистр, и строки DAD и dad здесь будут разными. Вот пример, позволяющий лучше проиллюстрировать это положение.

SELECT *
FROM authors
WHERE lname LIKE ‘LARS%’

Этот запрос для Microsoft SQL Server извлечет из таблицы authors записи, где фамилия (lname) имеет вид ‘larson’ или ‘lars’, хотя в запросе поиск определен с использованием верхнего регистра (‘LARS%’). В Oracle этот запрос не найдет фамилий ‘Larson’ или ‘Lars’, поскольку Oracle производит сравнение с учетом регистра.


DB2

Платформа DB2 поддерживает синтаксис предложения LIKE стандарта ANSI SQL 2003. Поддерживаются обобщающие символы % и знак подчеркивания (_). Поддерживаются отменяющие последовательности.

Платформа DB2 учитывает регистр, поэтому здесь реализация предложения LIKE полностью чувствительна к регистру. Чтобы значения в разных регистрах всегда сравнивались без учета регистра, нужно использовать функцию UPPER или TRANSLATE. Кроме того, DB2 неявно преобразует кодовую страницу шаблона строки или отменяющей последователъности к кодовой странице выражения, если только они не определены с предложением FOR BIT DATA.


MySQL

Платформа MySQL поддерживает для предложения LIKE синтаксис стандарта ANSI. Поддерживаются обобщающие символы % и знак подчеркивания (_). Также поддерживается предложение ESCAPE.

Кроме того, MySQL поддерживает специальные функции REGEXP и NOT RLIKE, применяемые при проверке регулярных выражений. MySQL после версии 3.23.4 по умолчанию не учитывает регистр.


Oracle

Платформа Oracle поддерживает для предложения LIKE синтаксис стандарта ANSI. Поддерживаются обобщающие символы % и знак подчеркивания (_). Также поддерживается предложение ESCAPE. Синтаксис предложения LIKE в Oracle следующий.

WHERE выражение [NOT] {LIKE | LIKEC | LIKE2 |

LIKE4} строковый_шаблон [ESCAPE отменяющая_последовательность]

Специфичные для Oracle синтаксические элементы имеют следующие значения.

LIKEC

Используется полный набор символов UNICODE.

LIKE2

Используется набор символов UNICODE USC2.

LIKE4

Используется набор символов UNICODE USC4.

Поскольку платформа Oracle учитывает регистр, следует включать выражение, строковый_шаблон или и то и другое в функцию UPPER. В этом случае вы всегда будете сравнивать то, что нужно.


PostgreSQL

Платформа PostgreSQL поддерживает ANSI синтаксис предложения LIKE. Поддерживаются обобщающие символы % и знак подчеркивания (_). Также поддерживаются отменяющие последовательности.

PostgreSQL по умолчанию учитывает регистр. Для сравнения без учета регистра в PostgreSQL существует ключевое слово ILIKE. Также вы можете использовать оператор — как эквивалент LIKE и -* как эквивалент ILIKE, а также !- и !-* как эквиваленты NOT LIKE и NOT ILIKE соответственно. Это все расширения стандарта ANSI, которые существуют в PostgreSQL.

Например, следующие запросы функционально эквивалентны.

SELECT
*
FROM authors
WHERE city LIKE ‘%ville’;

SELECT
*
FROM authors
WHERE city — ^ville’;

Поскольку в этих примерах используется нижний регистр, вы можете столкнуться с проблемой учета регистра. То есть запрос ведет поиск по строке ‘%ville’ в нижнем регистре, а таблица может содержать значения в верхнем регистре, которые не попадут в результаты — ‘BROWNSVILLE’, ‘NASHVILLE’, ‘HUNTSVILLE’. Эту проблему можно решить так, как показано в следующем примере.

Преобразуем значения в верхний регистр

SELECT *
FROM authors
WHERE city LIKE UPPER(‘%ville’);

Производим сравнение без учета регистра SELECT * FROM authors WHERE city ~~* ‘%ville’;

SELECT *
FROM authors
WHERE city LIKE ‘%ville’;

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


SQL Server

Платформа SQL Server поддерживает ANSI синтаксис предложения LIKE. Поддерживаются отменяющие последовательности. Поддерживаются также следующие дополнительные обобщающие операторы.

[] — соответствует любому значению из указанного набора, например [abc], или диапазона, например [к-п].

[Л] — соответствует любому символу, не входящему в указанный набор или диапазон.

Используя дополнительные обобщающие операторы SQL Server, вы получаете дополнительные возможности. Например, вы можете извлечь записи об авторах, фамилии которых Carson, Carsen, Karson или Karsen.

SELECT *
FROM authors
WHERE au_lname LIKE ‘[CK]ars[eo]n’

Или вы можете извлечь записи об авторах, фамилии которых заканчиваются на «arson» или «arsen», но не Larsen или Larson.

SELECT *
FROM authors
WHERE au_lname LIKE ‘[A-Z^L]ars[eo]n’

Источник