В SQL Server можете да използвате T-SQL PATINDEX() функция за намиране на шаблон в низ. По-конкретно, функцията връща само първия поява на шаблона в низа.
Функцията приема два аргумента; моделът и низът.
Можете да използвате заместващи знаци в шаблона.
Синтаксис
Синтаксисът е така:
PATINDEX ( '%pattern%' , expression )
Където шаблон е символен израз, който съдържа последователността, която трябва да бъде намерена, и израз е изразът, който трябва да се търси.
Пример 1 – Основна употреба
Ето пример за това как работи:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result; Резултат:
+----------+ | Result | |----------| | 12 | +----------+
Знакът за процент (% ) е заместващ знак, който представлява всеки низ от нула или повече знака.
Пример 2 – Няма съвпадение
Ето какво се случва, когато не включим заместващите знаци:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result; Резултат:
+----------+ | Result | |----------| | 0 | +----------+
Въпреки че, ако пълният низ съвпада с шаблона без заместващи знаци, ще получите съвпадение:
SELECT PATINDEX('Bob', 'Bob') AS Result; Резултат:
+----------+ | Result | |----------| | 1 | +----------+
Въпреки това, няма да получите съвпадение, ако низът съдържа повече знаци:
SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result; Резултат:
+----------+ | Result | |----------| | 0 | +----------+
В този случай можете да използвате един заместващ знак:
SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result; Резултат:
+----------+ | Result | |----------| | 1 | +----------+
Можете също да използвате един заместващ знак някъде в средата на шаблона:
SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result; Резултат:
+----------+ | Result | |----------| | 1 | +----------+
В този случай получихме съвпадение, защото началото и краят на низа съвпадаха с началото и края на шаблона. Разбира се, средата на низа съвпада и със средата на шаблона, защото всички останали знаци са покрити от знака за процент.
Пример 3 – Заместващият знак за долна черта
Ето още един пример, в който въвеждаме друг заместващ знак:
SELECT PATINDEX('B_er', 'Beer') AS Result; Резултат:
+----------+ | Result | |----------| | 1 | +----------+
Долната черта (_ ), което е заместващ знак за всеки единичен знак. Следователно, той ще съвпада само ако има точно един знак в тази позиция.
Разбира се, горният модел може да съответства на много различни низове. Например:
SELECT
PATINDEX('B_er', 'Beer') AS 'Beer',
PATINDEX('B_er', 'Bier') AS 'Bier',
PATINDEX('B_er', 'Baer') AS 'Baer',
PATINDEX('B_er', 'B er') AS 'B er'; Резултат:
+--------+--------+--------+--------+ | Beer | Bier | Baer | B er | |--------+--------+--------+--------| | 1 | 1 | 1 | 1 | +--------+--------+--------+--------+
Пример 4 – Сравняване на _ и % Заместващи символи
Този пример демонстрира разликата между _ и % заместващи знаци.
SELECT
PATINDEX('B%r', 'Beer') AS '%',
PATINDEX('B_r', 'Beer') AS '_',
PATINDEX('B__r', 'Beer') AS '__'; Резултат:
+-----+-----+------+ | % | _ | __ | |-----+-----+------| | 1 | 0 | 1 | +-----+-----+------+
Долната черта съвпада само когато има точно един знак в тази позиция. За да съпоставим два знака, трябва да използваме две долни черти.
Знакът за процент, от друга страна, съответства на произволен брой знаци, включително нула, както се вижда в следния пример:
SELECT
PATINDEX('Bee%r', 'Beer') AS '%',
PATINDEX('Bee_r', 'Beer') AS '_',
PATINDEX('Bee__r', 'Beer') AS '__'; Резултат:
+-----+-----+------+ | % | _ | __ | |-----+-----+------| | 1 | 0 | 0 | +-----+-----+------+
Пример 5 – Пример за база данни
Ето пример за използване на тази функция в заявка към база данни:
USE Music;
SELECT
AlbumName,
PATINDEX('%the%', AlbumName) AS 'Pattern Index'
FROM Albums
WHERE PATINDEX('%the%', AlbumName) > 0;
Резултат:
+-------------------------+-----------------+ | AlbumName | Pattern Index | |-------------------------+-----------------| | Singing Down the Lane | 14 | | Ziltoid the Omniscient | 9 | | No Prayer for the Dying | 15 | | The Sixteen Men of Tain | 1 | +-------------------------+-----------------+
В този случай използвам WHERE клауза за връщане само на онези албуми, които действително съвпадат, заедно с техния PATINDEX() резултат. Ако изпусна WHERE клауза, всички албуми ще бъдат върнати, независимо дали съвпадат или не.
За тези, които не съвпадат, PATINDEX() резултатът ще бъде нула.
USE Music;
SELECT TOP(10)
AlbumName,
PATINDEX('%the%', AlbumName) AS 'Pattern Index'
FROM Albums;
Резултат:
+-------------------------+-----------------+ | AlbumName | Pattern Index | |-------------------------+-----------------| | Powerslave | 0 | | Powerage | 0 | | Singing Down the Lane | 14 | | Ziltoid the Omniscient | 9 | | Casualties of Cool | 0 | | Epicloud | 0 | | Somewhere in Time | 0 | | Piece of Mind | 0 | | Killers | 0 | | No Prayer for the Dying | 15 | +-------------------------+-----------------+
Пример 6 – Само първо появяване
Както бе споменато, PATINDEX() връща само първия поява на шаблона в низа.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result; Резултат:
+----------+ | Result | |----------| | 5 | +----------+
CHARINDEX() Функция
T-SQL CHARINDEX() функцията е подобна на PATINDEX() . Има обаче някои разлики между двете. По-специално, PATINDEX() приема заместващи знаци, но не и начална позиция. CHARINDEX() от друга страна приема начална позиция, но не и заместващи знаци.