Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

CHARINDEX() срещу PATINDEX() в SQL Server – Каква е разликата?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвате UPDATE от SELECT в SQL Server

  2. Премахнете и намалете припокриващите се периоди от време

  3. Как да изброите всички дати между две дати

  4. Как да създадете SQL Trace за заснемане на събития на SQL Server

  5. Как да направите UPDATE Pass-Through заявка в SQL Server