Функции 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