Data: 8.07.2021

Jak używać funkcji CHARINDEX w MS SQL

MS SQL funkcja CHARINDEX

Spis treści

W artykule MS SQL funkcja CHARINDEX znajdziesz szczegółowy opis funkcji CHARINDEX wraz z praktycznymi przykładami jej wykorzystania.

Przykłady możesz uruchomić w bazie Northwind lub AventureWorks.

MS SQL funkcja CHARINDEX – składnia funkcji

Funkcja CHARINDEX wyszukuje jedno wyrażenie tekstowe w innym wyrażeniu tekstowym. Jeśli szukane wyrażenie zostanie znalezione, zwracana jest pozycja początkowa znalezionego wyrażenia.

Title

Argumenty funkcji CHARINDEX

Argumenty funkcji CHARINDEX:

  • search_expression varchar(1) – tekst, którego szukamy. Tekst może zawierać jeden lub więcej znaków. Słowo „varchar” to informacja, że w argumencie musi być podany ciąg znaków.
  • expression_to_be_searched varchar(1) – tekst, który przeszukujemy, aby znaleźć wyrażenie podane w argumencie „search_expression”. Słowo „varchar” to informacja, że w argumencie musi być podany ciąg znaków.
  • start_location int – argument opcjonalny, w którym możemy podać, od którego znaku należy zacząć poszukiwanie. Słowo „int” to informacja, że w argumencie musi zostać podana liczba całkowita (integer).

Wyszukiwanie rozpocznie się od początku przeszukiwanego tekstu, jeśli w argumencie „start_location”:

  • nie podamy żadnej wartości
  • podamy wartość ujemną
  • podamy wartość zero

Funkcja zwraca pozycję pierwszego wystąpienia szukanego znaku lub tekstu licząc od jedynki.

Przykłady funkcji CHARINDEX() – znajdujemy szukane wyrażenie

Poniżej znajdziesz przykłady zastosowania funkcji CHARINDEX(), w których znajdujemy szukany znak lub wyrażenie.

Przykład 1

SELECT CHARINDEX('s', 'Język SQL');
-- Wynik: 7

W przykładzie szukamy litery „s” w ciągu znaków „Język SQL”. Litera „s” jest na siódmej pozycji w przeszukiwanym ciągu znaków. Dlatego w wyniku zwrócona została wartość 7.

W argumencie „start_location” nie wpisujemy żadnej wartości, więc przeszukiwanie zaczyna się od początku tekstu „Język SQL”.

Przykład 2

SELECT CHARINDEX('SQL', 'Język SQL');
-- Wynik: 7

W przykładzie szukamy ciągu tekstowego „SQL” w ciągu tekstowym „Język SQL”. Znaleziony ciąg znaków „SQL” zaczyna się na pozycji siódmej w przeszukiwanym tekście. Dlatego w wyniku zwrócona została wartość 7.

W argumencie „start_location” nie wpisujemy żadnej wartości, więc przeszukiwanie zaczyna się od początku tekstu „Język SQL”.

Przykład 3

SELECT CHARINDEX('język', 'język SQL, język Python',10);
-- Wynik: 12

W przykładzie szukamy ciągu tekstowego „język” w ciągu tekstowym „język SQL, język Python”.

W argumencie „start_location” podaliśmy wartość 10, więc przeszukiwanie zaczyna się od 10 znaku wyrażenia „język SQL, język Python”.

W związku z tym, że rozpoczynamy przeszukiwanie od 10 znaku znalezione zostało drugie wystąpienie słowa „język”. Pierwszy znak drugiego wystąpienia słowa „język” znajduje się na 12 pozycji (licząc od początku ciągu tekstowego), więc w wyniku otrzymaliśmy 12.

Przykłady funkcji CHARINDEX() – nie znajdujemy szukanego wyrażenia

Jeśli funkcja CHARINDEX nie znajdzie szukanego wyrażenia zwraca wartość zero.

Przykład 4

SELECT CHARINDEX('Python', 'Język SQL');
-- Wynik: 0

W przykładzie szukamy tekstu „Python” w tekście „Język SQL”.

Tekst „Python” nie został znaleziony, więc w wyniku otrzymujemy zero.

CHARINDEX i wartość specjalna NULL w wyrażeniu

Jeśli któreś z wyrażeń (szukane lub przeszukiwane) ma wartość specjalną NULL, funkcja CHARINDEX() zwraca NULL.

Przykład 5

SELECT CHARINDEX('a', NULL);
-- Wynik: NULL

W przykładzie szukamy litery „a” w wyrażeniu o wartości specjalnej NULL. W wyniku otrzymujemy NULL.

Przykłady z baz danych Northwind i AdventureWorks2017

Przykład 6

USE AdventureWorks2017;
SELECT
EmailAddress,
CHARINDEX('@', EmailAddress) as t1,
LEFT(EmailAddress, CHARINDEX('@', EmailAddress)-1) as t2
FROM Person.EmailAddress;

Wynik:

Title

W przykładzie chcemy z adresu e-mail (kolumna EmailAddress) odczytać nazwę użytkownika np. nazwę „a0”.

Za pomocą funkcji CHARINDEX() znajdujemy, na której pozycji znajduje się znak małpy (@). Wynik działania funkcji znajduje się w kolumnie o nazwie t1.

Za pomocą funkcji LEFT(), z kolumny EmailAddress odczytujemy znaki od lewej strony.

Odczytujemy tyle znaków, ile jest w wyniku, który zwróciła funkcja CHARINDEX(). W związku z tym w wyniku działania funkcji LEFT() otrzymamy nazwę użytkownika razem ze znakiem małpy.

Aby nie odczytywać znaku małpy, od wyniku działania funkcji CHARINDEX() odejmujemy jeden znak. Wynik znajduje się w kolumnie t2

Przykład 7

USE northwind;
SELECT
ContactName,
CHARINDEX(' ', [ContactName]) Spacja,
SUBSTRING([ContactName], 1, CHARINDEX(' ', [ContactName]) - 1) Imię,
SUBSTRING([ContactName], CHARINDEX(' ', [ContactName]) + 1, 9999) Nazwisko
from Customers;

Wynik:

ContactNameSpacjaImięNazwisko
1Maria Anders6MariaAnders
2Ana Trujillo4AnaTrujillo
3Antonio Moreno8AntonioMoreno
4Thomas Hardy7ThomasHardy
5Christina Berglund10ChristinaBerglund
6Hanna Moos6HannaMoos

W przykładzie chcemy wyświetlić w oddzielnych kolumnach imię i nazwisko znajdujące się w kolumnie ContactName:

  • za pomocą funkcji CHARINDEX() znajdujemy, na której pozycji znajduje się znak spacji. Wynik działania funkcji znajduje się w kolumnie o nazwie Spacja
  • za pomocą funkcji SUBSTRING() z kolumny ContactName odczytujemy imię. Zaczynamy od pierwszego znaku (licząc od lewej). Informacji ile znaków mamy odczytać dostarcza nam funkcja CHARINDEX(). Odejmujemy jedynkę od wyniku funkcji CHARINDEX(), aby nie odczytywać spacji. Wynik mamy w kolumnie o nazwie Imię
  • za pomocą funkcji SUBSTRING() z kolumny ContactName odczytujemy nazwisko. Informacji, od którego znaku mamy zacząć odczytywanie dostarcza nam funkcja CHARINDEX(). CHARINDEX() zwraca informację, na której pozycji jest spacja. Dodajemy jedynkę, aby zacząć odczytywanie od pierwszego znaku po spacji.
  • w trzecim argumencie funkcji SUBSTRING() podajemy ile znaków chcemy odczytać. Wpisaliśmy tutaj 9999, co pozwoli nam na odczytanie wszystkich znaków od pierwszego znaku po spacji do końca tj. do prawej strony ciągu tekstowego

Opis funkcji LEFT() i SUBSTRING() znajdziesz w artykule Funkcje tekstowe w SQL Server.

CHARINDEX, a małe i wielkie litery

Sposób, w jaki funkcja CHARINDEX() traktuje małe i wielkie litery zależy od ustawionego w SQL Server collation. Jeśli collation w SQL Server ustawione zostało w taki sposób, że mają nie być rozróżniane małe i wielkie litery, funkcja CHARINDEX() też ich nie rozróżnia.

Przedstawione wyżej przykłady oraz ponad 100 innych ćwiczeń znajdziesz na naszym kursie SQL na poziomie średnio-zaawansowanym.

Jarek Olechno
Jarek Olechno
Programista SQL, Cloud Developer
Udostępnij wpis:udostępnij Facebookudostępnij Linkedinudostępnij e-mail

Polecane