В SQL Server можете да използвате T-SQL CHARINDEX()
функция или PATINDEX()
функция за намиране на низ в друг низ. Ето кратък преглед на всяка функция.
Функцията CHARINDEX()
Тази функция приема 3 аргумента; низът за намиране, низът за търсене и незадължителна начална позиция.
CHARINDEX()
синтаксисът е така:
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
Където expressionToFind е изразът, който искате да намерите в другия низ, и expressionToSearch е другият низ. Незадължителният начално_местоположение може да се използва за определяне на позиция в рамките на expressionToSearch за което да започнете да търсите.
Имайте предвид, че се връща само позицията на първото появяване.
Пример
Ето един пример:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.');
Резултат:
1
В този пример първият аргумент е Bob
, което означава, че търсим втория аргумент за Bob
. Резултатът е 1, защото това е позицията, където Bob
първият се появява във втория аргумент.
Може също да забележите, че Bob
всъщност се появява два пъти в низа, но се връща само позицията на първото съвпадение.
Няма съвпадение
Ако вторият аргумент не съдържа Bob
резултатът би бил 0
.
SELECT CHARINDEX('Kate', 'Bob likes beer. Bob also likes beef.');
Резултат:
0
Указване на начална позиция
Можете да посочите начална позиция откъде да започнете търсенето. Това означава, че SQL Server ще пропусне всяко събитие, което идва преди тази начална позиция. Въпреки това резултатите все още се отчитат въз основа на неговата позиция в низа (не от началната позиция).
Ако това звучи объркващо, следният пример би трябвало да помогне:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Резултат:
17
Така че в този пример започваме да търсим на позиция 16 (която е мястото преди 2-ри Bob
). Резултатът е, че първото поява на Bob
се пропуска и позицията на втория се връща. И можем да видим, че позицията му е на 17 знака от началото на низа (въпреки че е само един знак от мястото, където започнахме търсенето).
Чувствителност на малки и малки букви
Можете изрично да извършите търсене, чувствително към малки и големи букви, като добавите клаузата COLLATE към вашия оператор SELECT:
Регистърът на буквите е чувствителен
Ето търсене с чувствителност към главни и малки букви:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);
Резултат:
0
Това е чувствително към малките букви, защото _CS
означава Чувствителен на малки букви.
Регистърът не е чувствителен
И ето търсене, независимо от главните букви:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);
Резултат:
11
Това е независимо от главните букви, защото _CI
съкращение от регистр без значение.
Функцията PATINDEX()
PATINDEX()
функцията изпълнява подобна работа на CHARINDEX()
. По принцип имате избор кой да използвате. Основната разлика е в синтаксиса.
PATINDEX()
Синтаксисът на функцията е така:
PATINDEX ( '%pattern%' , expression )
Където шаблон е символен израз, който съдържа последователността, която трябва да бъде намерена, и израз е изразът, който трябва да се търси (обикновено колона).
PATINDEX()
приема заместващи знаци, но не и начална позиция. CHARINDEX()
от друга страна приема начална позиция, но не и заместващи знаци.
Примери
Ето един пример:
SELECT PATINDEX('%eer%', 'Bob likes beer.');
Резултат:
12
Ето какво се случва обаче, когато не включим заместващите знаци:
SELECT PATINDEX('eer', 'Bob likes beer.');
Резултат:
0
Ето още един пример, в който въвеждаме друг заместващ знак:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');
Резултат:
11
В този случай долната черта (_
), което е заместващ знак за всеки единичен знак.