В SQL Server можете да използвате или CHARINDEX() функция или PATINDEX() функция за намиране на низ в низ. Това са Transact-SQL низови функции и са налични и в бази данни на Azure.
На пръв поглед изглежда, че тези функции правят точно същото нещо и в много случаи можете да използвате това, което предпочитате да използвате.
Има обаче няколко разлики, които могат да диктуват коя функция решите да използвате в определени сценарии. Те могат да бъдат обобщени със следното:
PATINDEX()ви позволява да използвате заместващи знаци за търсене на шаблони.CHARINDEX()не.CHARINDEX()приема трети аргумент, който ви позволява да посочите началната позиция на търсенето.PATINDEX()не.
Повече подробности за тези точки по-долу.
Определение
Първо, нека разгледаме официалната дефиниция или всяка функция.
CHARINDEX()- Търси един символен израз във втори символен израз, връщайки началната позиция на първия израз, ако бъде намерен.
PATINDEX()- Връща началната позиция на първото появяване на шаблон в определен израз или нули, ако шаблонът не е намерен, за всички валидни текстови и символни типове данни.
Синтаксис
А ето и официалния синтаксис на всяка функция.
CHARINDEX()
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
PATINDEX()
PATINDEX ( '%pattern%' , expression )
Така че и двете функции ви позволяват да търсите символен израз, но PATINDEX() функцията ви позволява да търсите модел . Така че това е допълнителна функционалност, която не получавате с CHARINDEX() функция. С PATINDEX() можете да използвате заместващи знаци, за да посочите шаблон за търсене, което може да бъде много удобно в някои ситуации.
Въпреки това, CHARINDEX() приема три аргумента, докато PATINDEX() приема само две. CHARINDEX() функцията приема незадължителен трети аргумент, който ви позволява да посочите началната позиция на търсенето. С други думи, CHARINDEX() функцията ви позволява да върнете само онези съвпадения, които се появяват след определена точка в низа.
Примери
Ето примери, които демонстрират допълнителната функционалност, предоставена от всяка функция.
CHARINDEX()
Тук предоставям трети аргумент за уточняване на позиция за започване на търсене. В този случай ще пропусне първото появяване на Bob и ще върне позицията на второто появяване.
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Резултат:
17
Така че, както споменахме, не можете да направите това с PATINDEX() защото не приема този трети параметър.
PATINDEX()
Сега ето пример за нещо, което можете да направите с PATINDEX() което не можете да направите с CHARINDEX() . В този пример използваме заместващи знаци, за да търсим шаблон:
SELECT PATINDEX('%b_er%', 'Bob likes beer.'); Резултат:
11
В този случай използваме знаците за проценти (% ), които са заместващи знаци, които показват, че произволен брой знаци могат да продължат и да последват нашия низ за търсене. Използваме също долното черта (_ ), което е заместващ знак за всеки единичен знак.
Заключение
Така че докато и двете CHARINDEX() и PATINDEX() предоставят подобна функционалност и в много случаи може да се използва едно от другото вместо другото, има моменти, в които ще трябва да използвате едното пред другото.
По-конкретно, бихте използвали CHARINDEX() когато искате да посочите начална позиция в низа за търсене. И бихте използвали PATINDEX() всеки път, когато трябва да посочите шаблон, който да търсите.