2.7. Transact-SQL, Поиск по шаблону

Нередко пользователям нужно найти какие-то строки, в написании которых они не уверены. Например, пользователи могут ввести в базу данных отчество Иванович или по ошибке Иваныч. Чтобы отобразить и то, и другое (а может быть и третий вариант), нужно использовать шаблоны. В данном случае, нужно найти все строки, в которых в поле отчества значения начинаются с Иван. В SQL это вполне реально. Если вы не знаете, как должна закончиться строка, то можно поставить знак % (процент). Например:

SELECT * 
FROM tbPeoples
WHERE vcSurName LIKE 'ИВАН%'

В результат попадут строки с отчеством Иваныч и Иванович.

Рассмотрим еще пример. Допустим, что нужно вывести все строки, в которых имя начинается с буквы «С». Это реализуется в следующем запросе:

SELECT * 
FROM tbPeoples
WHERE vcName LIKE 'С%'

В результате будут строки, в которых имя работника равно Сергей и Славик. Если бы в базе были бы другие имена на букву С, то эти имена также попали бы в результирующий набор.

Знак процента может быть в любом месте. Например, нужно вывести все фамилии, которые начинаются с буквы «С», и заканчиваются буквой «В»:

SELECT * 
FROM tbPeoples
WHERE vcFamil LIKE 'С%В'

Знак процента в данном случае заменяется любым количеством любых символов, но в начале и в конце обязательно должны быть буквы «С» и «В». В результате мы увидим фамилии Сидоров, Сергеев, Смирнов, Садоводов.

Следующий пример, разрешает, чтобы до «С» также были любые символы:

SELECT * 
FROM tbPeoples
WHERE vcFamil LIKE '%С%В'

В результате будут фамилии: СИДОРОВ, СЕРГЕЕВ, ВАСИЛЬЕВ, СМИРНОВ, САДОВОДОВ. Наиболее наглядной является фамилия Васильев. Она содержит букву «С» в середине и «В» в конце. Между этими буквами и до «С» может быть любое количество любых символов.

А что, если неизвестен только один символ? Например, в моей практике не раз встречались случаи с фамилиями, которые начинаются с буквы «С». Эти буквы в русской и английской раскладках находятся на одной клавише. Пользователи очень часто начинают ввод в английской раскладке, а когда видят ошибку, стирают все, кроме злополучной буквы «С». Я этот пример привожу очень часто, потому что он очень популярен. Если клиентская программа не проверяет, там, где это возможно наличие неправильных символов, то это может быть серьезной проблемой. В полях, которые должны содержать только русские буквы должна быть проверка на стороне клиента или на стороне сервера (с помощью ограничений) возможность использования только русских букв.

Итак, как найти фамилию Смирнов, если мы не знаем, в какой кодировке написана первая буква «С»? Нужно заменить ее на символ подчеркивания («_»):

SELECT * 
FROM tbPeoples
WHERE vcFamil LIKE '_МИРНОВ'

Символ подчеркивания означает один любой символ. Если % означал любое количество любых символов, то _ означает только один. Рассмотрим пример: "Т_К". В результат такого шаблона войдут слова: ТОК, ТУК, ТИК, но не войдет ТУПИК и другие слова, содержащие между буквами Т и К больше чем одну букву. Этот символ очень удобен, особенно для тех, кто прекрасно знает русский язык.

Представьте, что надо найти слово "корова", а вы не знаете, как писать "корова" или "карова". В этом случае просто пишем "к_рова" и вы не ошибетесь. Или вообще "к_р%". Красиво? А в принципе, это то же самое. Вот если бы в школе диктанты можно было бы так писать :).

В одном шаблоне можно использовать и символ процента и подчеркивание. Например, следующий пример показывает, как найти всех Смирновых, вне зависимости от пола и первой буквы:

SELECT * 
FROM tbPeoples
WHERE vcFamil LIKE '_МИРНОВ%'

Что значит, вне зависимости от пола? Это значит, что в результат попадет как фамилия Смирнов, так и Смирнова.

Обратите внимание, что для работы с шаблоном обязательно необходимо использовать вместо знака равенства оператор LIKE. Если поставить знак равенства, то шаблон действовать не будет.

Шаблоны действительно мощное средство поиска необходимых данных, а самое главное – очень простое средство.

Предыдущая глава

2.6. SELECT INTO Вставка в таблицу

Следующая глава

2.8. Связанные таблицы

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне