В 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()
от друга страна приема начална позиция, но не и заместващи знаци.