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

Как работи функцията PATINDEX() в SQL Server (T-SQL)

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. LIMIT 10..20 в SQL Server

  2. Как да нулирате стойността на колоната за идентичност в таблицата на SQL Server - SQL Server / T-SQL урок, част 43

  3. Клауза VALUES в SQL Server

  4. Как да конвертирате изображение в масив от байтове, като използвате само javascript, за да съхранявате изображение на sql сървър?

  5. Мога ли да използвам поток за ВМЪКВАНЕ или АКТУАЛИЗИРАНЕ на ред в SQL Server (C#)?