Функции CHARINDEX и PATINDEX
Функция CHARINDEX имеет синтаксис:
CHARINDEX(искомое_выражение, строковое_выражение [, стартовая_позиция ])Здесь необязательный целочисленный параметр стартовая_позиция определяет позицию в строковом выражении, начиная с которой выполняется поиск. Если этот параметр опущен, поиск выполняется от начала строкового_выражения. Например, запрос
SELECT name
FROM Ships
WHERE CHARINDEX('sh', name) > 0;| [[ column ]] | 
|---|
| NULL [[ value ]] | 
будет выводить те корабли, в которых имеется сочетание символов «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';| [[ column ]] | 
|---|
| NULL [[ value ]] | 
Обратите внимание, что при определении второго символа в функции CHARINDEX используется стартовая позиция, которой является позиция следующего за первой буквой a символа — CHARINDEX(‘a’, name)+1. Правильность результата — 2 и 10 — легко проверить.
Функция PATINDEX имеет следующий синтаксис:
PATINDEX( '%образец%' , строковое_выражение )Главное отличие этой функции от CHARINDEX заключается в том, что поисковая строка может содержать подстановочные знаки — % и _. При этом концевые знаки % являются обязательными. Например, использование этой функции в первом примере будет иметь вид
SELECT name
FROM Ships
WHERE PATINDEX('%sh%', name) > 0;| [[ column ]] | 
|---|
| NULL [[ value ]] | 
А вот, например, как можно найти имена кораблей, содержащие последовательность из трех символов, первый и последний из которых есть e:
SELECT name
FROM Ships
WHERE PATINDEX('%e_e%', name) > 0;| [[ column ]] | 
|---|
| NULL [[ value ]] | 
Результат выполнения этого запроса выглядит следующим образом:
| Name | 
|---|
| Revenge | 
| Royal Sovereign | 
Рекомендуемые упражнения: 136