Wycinanie fragmentów tekstu funkcjami Left, Right i Mid oraz sklejanie pól i napisów w jedną kolumnę wyniku.
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.
Left(tekst; ile)
Right(tekst; ile)
Mid(tekst; od; ile)
Len(tekst)
| W Accessie | Standardowy SQL | Znaczenie |
|---|---|---|
& |
(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 |
-- Rocznik z numeru PESEL: dwie pierwsze cyfry, wynik jako tekst SELECT nazwisko, pesel FROM uczniowie WHERE Left(pesel; 2) = '07'
| nazwisko | pesel |
|---|---|
| Kowalska | 07231212345 |
| Wiśniewski | 07212812345 |
| Dąbrowski | 07283012345 |
-- 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
| nazwisko | dzien |
|---|---|
| Kowalska | 12 |
| Nowak | 05 |
| Wiśniewski | 28 |
| Zając | 19 |
| Dąbrowski | 30 |
-- Pierwsza litera nazwiska: Left z jednym znakiem SELECT Left(nazwisko; 1) AS inicjal, imie FROM uczniowie
| inicjal | imie |
|---|---|
| K | Anna |
| N | Piotr |
| W | Marek |
| Z | Julia |
| D | Karol |
-- Sklejanie pól i wpisanego wprost tekstu w jedną kolumnę SELECT nazwisko & ' ' & imie AS kto, klasa FROM uczniowie
| kto | klasa |
|---|---|
| Kowalska Anna | 3A |
| Nowak Piotr | 3B |
| Wiśniewski Marek | 3A |
| Zając Julia | 3C |
| Dąbrowski Karol | 3B |
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.
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.
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.
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.
Zagadnienia z tego samego obszaru matury – warto je powtórzyć razem: