Функции CHARINDEX и PATINDEX

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

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

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

SELECT name
FROM Ships
WHERE CHARINDEX('sh', name) > 0;
🚫
[[ error ]]
[[ 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';
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]

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

Функция PATINDEX имеет следующий синтаксис:

PATINDEX( '%образец%' , строковое_выражение )

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

SELECT name
FROM Ships
WHERE PATINDEX('%sh%', name) > 0;
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]

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

SELECT name
FROM Ships
WHERE PATINDEX('%e_e%', name) > 0;
🚫
[[ error ]]
[[ column ]]
NULL [[ value ]]

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

Name
Revenge
Royal Sovereign

Рекомендуемые упражнения: 136