Funkcje wartości tekstowych
W MS SQL istnieje wiele funkcji do manipulowania tekstem, które pozwalają na modyfikowanie, formatowanie i analizę danych tekstowych.
Oto kilka z najczęściej używanych:
- LEN() - Zwraca długość łańcucha znaków.
SELECT LEN('Hello World');
Zapytanie to zwraca długość łańcucha znaków "Hello World", która wynosi 11 znaków.
- LEFT() - Zwraca określoną liczbę znaków z lewej strony łańcucha znaków.
SELECT LEFT('Hello World', 5);
Zapytanie zwraca pierwsze 5 znaków z lewej strony łańcucha znaków "Hello World".
- RIGHT() - Zwraca określoną liczbę znaków z prawej strony łańcucha znaków.
SELECT RIGHT('Hello World', 5);
Zapytanie zwraca ostatnie 5 znaków z prawej strony łańcucha znaków "Hello World".
- UPPER() - Konwertuje łańcuch znaków na wielkie litery.
SELECT UPPER('hello world');
Zapytanie zamienia wszystkie litery w łańcuchu znaków "hello world" na wielkie litery.
- LOWER() - Konwertuje łańcuch znaków na małe litery.
SELECT LOWER('HELLO WORLD');
Zapytanie zamienia wszystkie litery w łańcuchu znaków "HELLO WORLD" na małe litery.
- SUBSTRING() - Zwraca część łańcucha znaków rozpoczynając od określonej pozycji i o określonej długości.
SELECT SUBSTRING('Hello World', 7, 3);
Zapytanie zwraca podciąg łańcucha znaków "Hello World" rozpoczynający się od 7. znaku i mający długość 5 znaków.
- REPLACE() - Zamienia wystąpienia określonego fragmentu łańcucha znaków na inny fragment.
SELECT REPLACE('Hello World Hello', 'Hello', 'Hi');
Zapytanie zamienia wszystkie wystąpienia łańcucha "Hello" w łańcuchu "Hello World" na "Hi".
- TRIM() - Usuwa spacje z początku i końca łańcucha znaków.
SELECT TRIM(' Hello World ');
Zapytanie usuwa spacje z początku i końca łańcucha znaków " Hello World ".
- CONCAT() - Łączy dwa lub więcej łańcuchów znaków.
SELECT CONCAT('Hello', ' ', 'World');
Zapytanie łączy łańcuchy znaków "Hello", " " i "World" w jeden łańcuch "Hello World".
Co więcej funkcję CONTACT() można też zastąpić znakiem +:
SELECT 'Hello' + ' ' + 'World';
- CHARINDEX() - Zwraca pozycję określonego fragmentu w łańcuchu znaków.
SELECT CHARINDEX('ld', 'Hello World ld');
Zapytanie zwraca pozycję pierwszego wystąpienia łańcucha "World" w łańcuchu "Hello World", która wynosi 7.
Jeżeli szukana fraza nie zostanie znaleziona, zapytanie zwróci 0.
SELECT CHARINDEX('Hi', 'Hello World');
Łączenie wywoływań funkcji dla wartości tesktowych
Funkcje dla wartości tesktowych, które zwracają wartości tekstowe, można je łączyć w celu uzyskania bardziej złożonych operacji na tekście.
Przykład 1: Łączenie wywołań funkcji LOWER() i REPLACE():
Zamiana "HELLO WORLD" na "hi world" przez zamianę na małe litery i zastąpienie "hello" przez "hi".
SELECT REPLACE(LOWER('HELLO WORLD'), 'hello', 'hi');
W tym przykładzie:
-
Funkcja
LOWER('HELLO WORLD')zamienia tekst "HELLO WORLD" na małe litery, więc zwraca "hello world". -
Funkcja
REPLACE('hello world', 'hello', 'hi')zamienia wszystkie wystąpienia "hello" w łańcuchu "hello world" na "hi", więc zwraca "hi world".
Przykład 2: Łączenie wywołań funkcji LEFT() i CHARINDEX():
SELECT LEFT('Hello World', CHARINDEX(' ', 'Hello World') - 1);
W tym przykładzie:
-
Funkcja
CHARINDEX(' ', 'Hello World')zwraca pozycję pierwszej spacji w tekście "Hello World", czyli 6. -
Funkcja
LEFT('Hello World', 6 - 1)wybiera pierwsze 5 znaków (do pozycji spacji minus jeden) z lewej strony tekstu "Hello World", czyli "Hello".
Zadanie
- Zwróć informacje: Imie, Nazwisko oraz inicjały osób z tabeli
SalesLT.Customer
Rozwiązanie
-- ROZWIĄZANIE
SELECT FirstName, LastName, LEFT(FirstName, 1) + LEFT(LastName, 1) as Initials
FROM SalesLT.Customer
- Stwórz zapytanie SQL, które wykorzystując kolumnę EmailAddress z tabeli
SalesLT.Customer, zwróci jedynie część adresu e-mail, która znajduje się przed znakiem '@'. Na przykład, dla adresu e-mail 'robert4@adventure-works.com', zapytanie powinno zwrócić wartość 'robert4'."
Rozwiązanie tego zadania można osiągnąć poprzez zastosowanie funkcji tekstowych, takich jak LEFT() i CHARINDEX(), aby wyodrębnić część adresu e-mail przed znakiem "@".
Rozwiązanie
-- ROZWIĄZANIE
SELECT EmailAddress, LEFT(EmailAddress, CHARINDEX('@', EmailAddress) - 1) as UserName
FROM SalesLT.Customer
- Napisz zapytanie SQL, które zwróci identyfikatory produktów
ProductDescriptionIDoraz ich opisyDescriptionz tabeliSalesLT.ProductDescription, pod warunkiem, że długość opisu przekracza 20 znaków i jednocześnie opis nie zawiera znaku zapytania '?'.
Rozwiązanie
-- ROZWIĄZANIE
SELECT ProductDescriptionID, Description
FROM SalesLT.ProductDescription
WHERE LEN([Description]) > 20 AND CHARINDEX('?', [Description]) = 0