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.