В 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()
всеки път, когато трябва да посочите шаблон, който да търсите.