Справка по SQL | страница 25




>SELECT ASCII('ё') UNION ALL SELECT ASCII('Ё')


Я полагаю, что не будет сложным добавить эту букву в таблицу, если потребуется.

Рассмотрим теперь задачу определения нахождения искомой подстроки в строковом выражении. Для этого могут использоваться две функции - CHARINDEX и PATINDEX. Обе они возвращают начальную позицию (позицию первого символа подстроки) подстроки в строке. Функция CHARINDEX имеет синтаксис:

CHARINDEX (искомое_выражение, строковое_выражение[, стартовая_позиция])

Здесь необязательный целочисленный параметр стартовая_позиция определяет позицию в строковом выражении, начиная с которой выполняется поиск искомого_выражения . Если этот параметр опущен, поиск выполняется от начала строкового_выражения. Например, запрос


>SELECT name FROM Ships WHERE CHARINDEX('sh', name) 0


будет выводить те корабли, в которых имеется сочетание символов "sh". Здесь используется тот факт, что если искомая строка не будет обнаружена, то функция CHARINDEX возвращает 0. Результат выполнения запроса будет содержать следующие корабли:

name

Kirishima

Musashi

Washington


Следует отметить, что если искомая подстрока либо строковое выражение есть NULL, то результатом функции тоже будет NULL.

Следующий пример определяет позиции первого и второго вхождения символа "a" в имени корабля "California"


>SELECT CHARINDEX('a',name) first_a,

> CHARINDEX('a', name, CHARINDEX('a', name)+1) second_a

>FROM Ships WHERE name='California'


Обратите внимание, что при определении второго символа в функции используется стартовая позиция, которой является позиция следующего за первой буквой "a" символа - CHARINDEX('a', name)+1. Правильность результата - 2 и 10 - легко проверить :-).

Функция PATINDEX имеет синтаксис:


Главное отличие этой функции от CHARINDEX заключается в том, что поисковая строка может содержать подстановочные знаки - % и _. При этом концевые знаки "%" являются обязательными. Например, использование этой функции в первом примере будет иметь вид


>SELECT name FROM Ships WHERE PATINDEX('%sh%', name) 0


А вот, например, как можно найти имена кораблей, которые содержат последовательность из трех символов, первый и последний из которых есть "e":


>SELECT name FROM Ships WHERE PATINDEX('%e_e%', name) 0


Результат выполнения этого запроса выглядит следующим образом:

name

Revenge

Royal Sovereign


Парная к LEFT функция RIGHT возвращает заданное число символов справа из строкового выражения:


Вот, например, как можно определить имена кораблей, которые начинаются и заканчиваются на одну и ту же букву: