Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak działa funkcja PATINDEX() w SQL Server (T-SQL)

W SQL Server możesz użyć T-SQL PATINDEX() funkcja, aby znaleźć wzorzec w ciągu. W szczególności funkcja zwraca tylko pierwszy wystąpienie wzorca w ciągu.

Funkcja przyjmuje dwa argumenty; wzór i ciąg.

We wzorcu można używać symboli wieloznacznych.

Składnia

Składnia wygląda tak:

PATINDEX ( '%pattern%' , expression )

Gdzie wzór to wyrażenie znakowe, które zawiera sekwencję do znalezienia, a wyrażenie to wyrażenie do przeszukania.

Przykład 1 – Podstawowe użycie

Oto przykład tego, jak to działa:

SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;

Wynik:

+----------+
| Result   |
|----------|
| 12       |
+----------+

Znak procentowy (% ) to znak wieloznaczny, który reprezentuje dowolny ciąg składający się z zera lub większej liczby znaków.

Przykład 2 – Brak dopasowania

Oto, co się dzieje, gdy nie uwzględniamy symboli wieloznacznych:

SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;

Wynik:

+----------+
| Result   |
|----------|
| 0        |
+----------+

Chociaż, jeśli pełny ciąg pasuje do wzorca bez żadnych symboli wieloznacznych, otrzymasz dopasowanie:

SELECT PATINDEX('Bob', 'Bob') AS Result;

Wynik:

+----------+
| Result   |
|----------|
| 1        |
+----------+

Jednak nie otrzymasz dopasowania, jeśli ciąg zawiera więcej znaków:

SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;

Wynik:

+----------+
| Result   |
|----------|
| 0        |
+----------+

W takim przypadku możesz użyć jednego symbolu wieloznacznego:

SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;

Wynik:

+----------+
| Result   |
|----------|
| 1        |
+----------+

Możesz również użyć pojedynczego symbolu wieloznacznego gdzieś w środku wzorca:

SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;

Wynik:

+----------+
| Result   |
|----------|
| 1        |
+----------+

W tym przypadku otrzymaliśmy dopasowanie, ponieważ początek i koniec ciągu pasowały do ​​początku i końca wzorca. Oczywiście środek ciągu pasował również do środka wzorca, ponieważ wszystkie inne znaki są zakryte znakiem procentu.

Przykład 3 – Symbol wieloznaczny podkreślenia

Oto kolejny przykład, w którym wprowadzamy kolejny znak wieloznaczny:

SELECT PATINDEX('B_er', 'Beer') AS Result;

Wynik:

+----------+
| Result   |
|----------|
| 1        |
+----------+

Podkreślenie (_ ), który jest symbolem wieloznacznym dla dowolnego pojedynczego znaku. Dlatego będzie pasować tylko wtedy, gdy na tej pozycji znajduje się dokładnie jeden znak.

Oczywiście powyższy wzór mógłby pasować do wielu różnych ciągów. Na przykład:

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';

Wynik:

+--------+--------+--------+--------+
| Beer   | Bier   | Baer   | B er   |
|--------+--------+--------+--------|
| 1      | 1      | 1      | 1      |
+--------+--------+--------+--------+

Przykład 4 – Porównanie _ i % Symbole wieloznaczne

Ten przykład pokazuje różnicę między _ i % znaki wieloznaczne.

SELECT 
  PATINDEX('B%r', 'Beer') AS '%',
  PATINDEX('B_r', 'Beer') AS '_',
  PATINDEX('B__r', 'Beer') AS '__';

Wynik:

+-----+-----+------+
| %   | _   | __   |
|-----+-----+------|
| 1   | 0   | 1    |
+-----+-----+------+

Podkreślenie pasuje tylko wtedy, gdy na tej pozycji znajduje się dokładnie jedna postać. Aby dopasować dwa znaki, musimy użyć dwóch podkreśleń.

Z drugiej strony znak procentu pasuje do dowolnej liczby znaków, w tym do zera, jak widać w następującym przykładzie:

SELECT 
  PATINDEX('Bee%r', 'Beer') AS '%',
  PATINDEX('Bee_r', 'Beer') AS '_',
  PATINDEX('Bee__r', 'Beer') AS '__';

Wynik:

+-----+-----+------+
| %   | _   | __   |
|-----+-----+------|
| 1   | 0   | 0    |
+-----+-----+------+

Przykład 5 – Przykład bazy danych

Oto przykład użycia tej funkcji w zapytaniu do bazy danych:

USE Music;
SELECT 
  AlbumName,
  PATINDEX('%the%', AlbumName) AS 'Pattern Index'
FROM Albums
WHERE PATINDEX('%the%', AlbumName) > 0;

Wynik:

+-------------------------+-----------------+
| AlbumName               | Pattern Index   |
|-------------------------+-----------------|
| Singing Down the Lane   | 14              |
| Ziltoid the Omniscient  | 9               |
| No Prayer for the Dying | 15              |
| The Sixteen Men of Tain | 1               |
+-------------------------+-----------------+

W tym przypadku używam WHERE klauzula zwracająca tylko te albumy, które faktycznie pasują, wraz z ich PATINDEX() wynik. Jeśli upuściłem WHERE klauzula, wszystkie albumy zostałyby zwrócone, niezależnie od tego, czy pasują, czy nie.

Dla tych, które nie pasują, PATINDEX() wynik byłby zerem.

USE Music;
SELECT TOP(10)
  AlbumName,
  PATINDEX('%the%', AlbumName) AS 'Pattern Index'
FROM Albums;

Wynik:

+-------------------------+-----------------+
| 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              |
+-------------------------+-----------------+

Przykład 6 – Tylko pierwsze wystąpienie

Jak wspomniano, PATINDEX() zwraca tylko pierwszy wystąpienie wzorca w ciągu.

SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;

Wynik:

+----------+
| Result   |
|----------|
| 5        |
+----------+

CHARINDEX() Funkcja

T-SQL CHARINDEX() funkcja jest podobna do PATINDEX() . Istnieją jednak pewne różnice między nimi. W szczególności PATINDEX() akceptuje znaki wieloznaczne, ale nie pozycję początkową. CHARINDEX() z drugiej strony akceptuje pozycję początkową, ale nie symbole wieloznaczne.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zapobiec aktualizacjom tabeli, z wyjątkiem jednej sytuacji

  2. Jak wykonać wstawianie i zwracanie wstawionej tożsamości za pomocą Dappera?

  3. Odbuduj i zreorganizuj indeks SQL Server

  4. Jak uzyskać łączną sumę

  5. Funkcja SQL Server ROUND():do czego służy i dlaczego powinno cię to obchodzić?