w SQL Server możesz użyć funkcji T-SQL PATINDEX()
, aby znaleźć wzorzec w ciągu znaków. Funkcja zwraca tylko pierwsze wystąpienie wzorca w łańcuchu.
funkcja przyjmuje dwa argumenty; wzorzec i łańcuch znaków.
Możesz używać znaków wieloznacznych we wzorze.
składnia
składnia wygląda następująco:
PATINDEX ( '%pattern%' , expression )
gdzie wzorzec jest wyrażeniem znakowym, które zawiera sekwencję do znalezienia, a wyrażenie jest wyrażeniem do przeszukiwania.
przykład 1 – Podstawowe użycie
oto przykład, jak to działa:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;
wynik:
+----------+| Result ||----------|| 12 |+----------+
znak procentowy (%
) jest znakiem wieloznacznym, który reprezentuje dowolny znak.ciąg zero lub więcej znaków.
przykład 2 – brak dopasowania
oto, co się stanie, gdy nie dodamy znaków 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 uzyskasz dopasowania, jeśli łańcuch zawiera więcej znaków:
SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;
wynik:
+----------+| Result ||----------|| 0 |+----------+
w takim przypadku możesz użyć pojedynczego 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 mamy dopasowanie, ponieważ początek i koniec łańcucha pasują do początku i koniec wzoru. Oczywiście, środek ciągu również pasował do środka wzorca, ponieważ wszystkie inne znaki są objęte znakiem procentowym.
przykład 3-znak podkreślenia
oto kolejny przykład, w którym Wprowadzamy kolejny znak wieloznaczny:
SELECT PATINDEX('B_er', 'Beer') AS Result;
wynik:
+----------+| Result ||----------|| 1 |+----------+
podkreślnik (_
), który jest symbolem wieloznacznym dla każdego pojedynczego znaku. W związku z tym będzie pasować tylko wtedy, gdy będzie dokładnie jedna postać w tej pozycji.
oczywiście powyższy wzór może 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';
Result:
+--------+--------+--------+--------+| Beer | Bier | Baer | B er ||--------+--------+--------+--------|| 1 | 1 | 1 | 1 |+--------+--------+--------+--------+
przykład 4 – Porównanie symboli wieloznacznych _ i %
Ten przykład pokazuje różnicę między znakami wieloznacznymi_
I%
.
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 w tej pozycji znajduje się dokładnie jeden znak. Aby dopasować dwa znaki, musimy użyć dwóch podkreślników.
znak procentowy z drugiej strony pasuje do dowolnej liczby znaków, w tym zera, jak widać w poniższym 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 AlbumsWHERE 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 klauzuli WHERE
, aby zwrócić tylko te albumy, które faktycznie pasują, wraz z ich wynikiem PATINDEX()
. Jeśli wyrzucę klauzulęWHERE
, wszystkie albumy zostaną zwrócone, niezależnie od tego, czy pasują, czy nie.
dla tych, które nie pasowały, wynikPATINDEX()
byłby zerowy.
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 pierwsze wystąpienie wzorca w łańcuchu.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;
wynik:
+----------+| Result ||----------|| 5 |+----------+
funkcja CHARINDEX ()
funkcja T-SQL CHARINDEX()
jest podobna do PATINDEX()
. Istnieją jednak pewne różnice między nimi. W szczególności PATINDEX()
akceptuje znaki wieloznaczne, ale nie pozycję wyjściową. CHARINDEX()
z drugiej strony przyjmuje pozycję początkową, ale nie znaki wieloznaczne.