Wróć do: Bazy danych
średni SQLfunkcje tekstowePESELmatura rozszerzona z informatyki

Funkcje tekstowe i łączenie pól

Wycinanie fragmentów tekstu funkcjami Left, Right i Mid oraz sklejanie pól i napisów w jedną kolumnę wyniku.

01

Opis

Część informacji siedzi w środku wartości tekstowej, a nie w osobnej kolumnie. Numer PESEL koduje datę urodzenia na konkretnych pozycjach, kod pocztowy zawiera numer rejonu, sygnatura sprawy – rok. Żeby zapytać o taki fragment, trzeba go najpierw wyciąć. Służą do tego funkcje tekstowe.

Wszystkie działają na tej samej zasadzie: dostają tekst i informację, którą część z niego wziąć, a zwracają sam wycięty fragment. Można ich używać zarówno na liście kolumn po SELECT (żeby fragment pokazać), jak i w warunku WHERE (żeby po nim filtrować).

Numerowanie znaków zaczyna się od 1, nie od 0. To najczęstsze źródło pomyłek u osób przyzwyczajonych do programowania, gdzie pierwszy element ma zwykle numer zero. W SQL-u pierwszy znak tekstu to znak numer 1.

Wycinanie ze środka wymaga dwóch liczb: od którego znaku zacząć i ile znaków wziąć. Dzień urodzenia w numerze PESEL zajmuje pozycje piątą i szóstą, więc parametry to „zacznij od 5, weź 2 znaki".

Wynik wycięcia jest tekstem, nie liczbą. Porównując go, trzeba użyć apostrofów – '05', a nie 05. To ma znaczenie także przy sortowaniu: teksty porównują się znak po znaku, więc '10' jest „mniejsze" niż '9'. Jeśli potrzebna jest liczba, trzeba wycięty fragment jawnie przekonwertować.

Łączenie pól w jedną kolumnę. Często wygodniej pokazać „Kowalska Anna" w jednej kolumnie niż nazwisko i imię w dwóch. Do sklejania tekstów służy operator łączenia – w Accessie jest to znak &, w standardowym SQL-u podwójna kreska pionowa. Sklejać można zarówno kolumny, jak i wpisane wprost napisy: żeby między nazwiskiem a imieniem pojawiła się spacja, trzeba ją dokleić jako osobny tekst ' '.

Kolumnie powstałej ze sklejenia trzeba nadać nazwę etykietą AS – inaczej nagłówek będzie nieczytelny.

Do wyszukiwania po wzorcu, a nie po konkretnej pozycji, lepiej nadaje się operator LIKE.

02

Funkcje

Left(tekst; ile)
znaki od lewejZwraca zadaną liczbę pierwszych znaków tekstu.
Right(tekst; ile)
znaki od prawejTo samo, licząc od końca.
Mid(tekst; od; ile)
fragment ze środkaZaczyna od znaku o podanym numerze i bierze zadaną ich liczbę.
Len(tekst)
długośćZwraca liczbę znaków. Przydatne do sprawdzania poprawności długości numeru.
03

Dialekt

W AccessieStandardowy SQLZnaczenie
& (podwójna kreska pionowa) łączenie tekstów w jedną wartość
Mid(t; od; ile) SUBSTRING(t FROM od FOR ile) wycięcie fragmentu ze środka
Len(t) LENGTH(t) długość tekstu w znakach
04

Zapytanie

-- Rocznik z numeru PESEL: dwie pierwsze cyfry, wynik jako tekst
SELECT nazwisko, pesel
FROM uczniowie
WHERE Left(pesel; 2) = '07'
Wynik zapytania
nazwiskopesel
Kowalska07231212345
Wiśniewski07212812345
Dąbrowski07283012345
-- Dzień urodzenia siedzi na pozycjach 5-6 - stąd Mid od 5 na długość 2
SELECT nazwisko, Mid(pesel; 5; 2) AS dzien
FROM uczniowie
Wynik zapytania
nazwiskodzien
Kowalska12
Nowak05
Wiśniewski28
Zając19
Dąbrowski30
-- Pierwsza litera nazwiska: Left z jednym znakiem
SELECT Left(nazwisko; 1) AS inicjal, imie
FROM uczniowie
Wynik zapytania
inicjalimie
KAnna
NPiotr
WMarek
ZJulia
DKarol
-- Sklejanie pól i wpisanego wprost tekstu w jedną kolumnę
SELECT nazwisko & ' ' & imie AS kto, klasa
FROM uczniowie
Wynik zapytania
ktoklasa
Kowalska Anna3A
Nowak Piotr3B
Wiśniewski Marek3A
Zając Julia3C
Dąbrowski Karol3B

Na maturze

Policz pozycje na kartce, zanim napiszesz zapytanie. Wypisz numer PESEL znak po znaku i ponumeruj je od 1. Pomyłka o jeden to najczęstszy błąd w tym temacie, a wynik wygląda wtedy zupełnie wiarygodnie – po prostu odpowiada na inne pytanie.

Uwaga na miesiąc w numerze PESEL. Dla osób urodzonych od 2000 roku do numeru miesiąca doliczane jest 20 – maj zapisany jest więc jako 25, a nie 05. Wycinanie pozycji 3–4 i porównywanie ich z numerem miesiąca „wprost" zadziała tylko dla roczników z XX wieku. Przy dzisiejszych maturzystach jest to gotowa pułapka, więc jeśli zadanie dotyczy miesiąca urodzenia, sprawdź najpierw, jakie roczniki są w danych.

Wynik wycięcia porównuj z tekstem w apostrofach. Warunek na wyciętym miesiącu to = '05', nigdy = 5. Zapis bez apostrofów albo zgłosi błąd, albo cicho zwróci pustą tabelę, bo '05' i 5 to dla bazy dwie różne rzeczy.

Sprawdź, jakim znakiem Twoje narzędzie skleja teksty. To kolejny punkt, w którym Access rozjeżdża się ze standardem. Jeśli sklejanie nie działa, to niemal na pewno przyczyna.

06

Najczęściej zadawane pytania

Czy da się wyciąć fragment i od razu potraktować go jak liczbę?

Tak, ale wymaga to jawnej konwersji – w Accessie funkcją zamieniającą tekst na liczbę całkowitą. Bez niej porównania będą tekstowe, co przy liczbach o różnej liczbie cyfr daje mylące wyniki.

Co się stanie, gdy poproszę o więcej znaków, niż tekst ma?

Funkcja nie zgłosi błędu – zwróci po prostu tyle, ile jest. Wycięcie 5 znaków z trzyliterowego tekstu da ten trzyliterowy tekst.

Czy funkcje tekstowe działają na kolumnach liczbowych?

Zwykle tak, bo baza najpierw zamienia liczbę na tekst. Bywa to jednak zawodne przy liczbach ułamkowych – zależy od tego, jak zostaną wypisane. Jeśli numer ma być cięty na fragmenty, lepiej przechowywać go od początku jako tekst.

Powiązane zagadnienia