W SQL Server możesz użyć T-SQL CHARINDEX()
funkcji lub PATINDEX()
funkcja, aby znaleźć ciąg w innym ciągu. Oto krótki przegląd każdej funkcji.
Funkcja CHARINDEX()
Ta funkcja przyjmuje 3 argumenty; ciąg do znalezienia, ciąg do wyszukania i opcjonalna pozycja początkowa.
CHARINDEX()
składnia wygląda tak:
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
Gdzie expressionToFind to wyrażenie, które chcesz znaleźć w drugim ciągu, a expressionToSearch to drugi ciąg. Opcjonalna start_location może służyć do określenia pozycji w expressionToSearch dla którego rozpocząć wyszukiwanie.
Zwróć uwagę, że zwracana jest tylko pozycja pierwszego wystąpienia.
Przykład
Oto przykład:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.');
Wynik:
1
W tym przykładzie pierwszym argumentem jest Bob
, co oznacza, że szukamy drugiego argumentu dla Bob
. Wynik to 1, ponieważ jest to pozycja, w której Bob
pierwszy pojawia się w drugim argumencie.
Możesz również zauważyć, że Bob
faktycznie pojawia się dwa razy w ciągu, ale zwracana jest tylko pozycja pierwszego dopasowania.
Brak dopasowania
Jeśli drugi argument nie zawierał Bob
wynik byłby 0
.
SELECT CHARINDEX('Kate', 'Bob likes beer. Bob also likes beef.');
Wynik:
0
Określanie pozycji startowej
Możesz określić pozycję początkową, od której chcesz rozpocząć wyszukiwanie. Oznacza to, że SQL Server pominie wszelkie zdarzenia, które pojawią się przed tą pozycją początkową. Jednak wyniki są nadal raportowane na podstawie ich pozycji w ciągu (nie od pozycji początkowej).
Jeśli brzmi to dezorientująco, powinien pomóc następujący przykład:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Wynik:
17
W tym przykładzie zaczynamy wyszukiwanie od pozycji 16 (która jest spacją przed drugim Bob
). W rezultacie pierwsze wystąpienie Bob
zostanie pominięty, a pozycja drugiego zostanie zwrócona. I widzimy, że jego pozycja wynosi 17 znaków od początku ciągu (mimo że jest to tylko jeden znak od miejsca, w którym rozpoczęliśmy wyszukiwanie).
Rozróżnianie wielkości liter
Możesz jawnie przeprowadzić wyszukiwanie z uwzględnieniem wielkości liter, dodając klauzulę COLLATE do instrukcji SELECT:
Rozróżnianie wielkości liter
Oto wyszukiwanie z uwzględnieniem wielkości liter:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);
Wynik:
0
Wielkość liter jest rozróżniana, ponieważ _CS
oznacza wielkość liter.
Nie uwzględnia wielkości liter
A oto wyszukiwanie bez rozróżniania wielkości liter:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);
Wynik:
11
Wielkość liter nie jest rozróżniana, ponieważ _CI
oznacza wielkość liter bez uwzględniania.
Funkcja PATINDEX()
PATINDEX()
funkcja wykonuje podobne zadanie do CHARINDEX()
. Zasadniczo masz wybór, którego użyć. Główna różnica tkwi w składni.
PATINDEX()
składnia funkcji wygląda następująco:
PATINDEX ( '%pattern%' , expression )
Gdzie wzór to wyrażenie znakowe, które zawiera sekwencję do znalezienia, a wyrażenie to wyrażenie do przeszukania (zazwyczaj kolumna).
PATINDEX()
akceptuje znaki wieloznaczne, ale nie pozycję początkową. CHARINDEX()
z drugiej strony akceptuje pozycję początkową, ale nie symbole wieloznaczne.
Przykłady
Oto przykład:
SELECT PATINDEX('%eer%', 'Bob likes beer.');
Wynik:
12
Oto jednak, co się dzieje, gdy nie uwzględniamy symboli wieloznacznych:
SELECT PATINDEX('eer', 'Bob likes beer.');
Wynik:
0
Oto kolejny przykład, w którym wprowadzamy kolejny znak wieloznaczny:
SELECT PATINDEX('%b_er%', 'Bob likes beer.');
Wynik:
11
W tym przypadku podkreślenie (_
), który jest symbolem wieloznacznym dla dowolnego pojedynczego znaku.