W SQL Server możesz użyć T-SQL CHARINDEX()
funkcja, aby znaleźć początkową pozycję wyrażenia znakowego w innym wyrażeniu znakowym.
Jako argumenty podajesz oba wyrażenia znakowe. Możesz również podać opcjonalny argument, aby określić pozycję, w której należy rozpocząć wyszukiwanie.
Składnia
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.') AS Result;
Wynik:
+----------+ | Result | |----------| | 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('Bob', 'Kate likes beer. Kate also likes beef.') AS Result;
Wynik:
+----------+ | Result | |----------| | 0 | +----------+
Określanie pozycji startowej
Możesz (opcjonalnie) określić pozycję początkową wyszukiwania. 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 całym ciągu (nie z wybranej przez Ciebie pozycji początkowej).
Oto przykład do zademonstrowania:
SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16) AS Result;
Wynik:
+----------+ | Result | |----------| | 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 COLLATE
klauzula do twojego SELECT
oświadczenie:
Oto przykład, który obejmuje wyszukiwanie z rozróżnianiem wielkości liter i wyszukiwanie bez rozróżniania wielkości liter:
SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS) AS 'Case-Sensitive', CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS) AS 'Case-Insensitive';
Wynik:
+------------------+--------------------+ | Case-Sensitive | Case-Insensitive | |------------------+--------------------| | 0 | 11 | +------------------+--------------------+
W pierwszym z nich rozróżniana jest wielkość liter, ponieważ _CS
(w zestawieniu) oznacza Case-Sensitive. Drugi nie uwzględnia wielkości liter, ponieważ _CI
oznacza wielkość liter bez uwzględniania.