Praca z tablicami to nie tylko ich tworzenie i przechowywanie — często pojawia się potrzeba wyciągnięcia pojedynczych elementów albo przeanalizowania ich zawartości. PostgreSQL oferuje kilka wbudowanych funkcji do takich operacji. Zobaczmy je po kolei.
Funkcja unnest(): rozpakowywanie tablicy
Funkcja unnest() dosłownie rozpakowuje tablicę, zamieniając jej elementy na osobne wiersze. To mega przydatne, jeśli chcesz pracować z danymi z tablicy jak z normalną tabelą.
Przykład 1: Proste rozpakowanie tablicy
Załóżmy, że mamy tablicę z nazwami wydziałów:
SELECT ARRAY['Informatyka', 'Matematyka', 'Fizyka'] AS wydzialy;
Teraz chcemy wyciągnąć każdy element jako osobny wiersz. Używamy unnest():
SELECT unnest(ARRAY['Informatyka', 'Matematyka', 'Fizyka']) AS wydzial;
Wynik:
| wydzial |
|---|
| Informatyka |
| Matematyka |
| Fizyka |
Przykład 2: Rozpakowanie tablicy w tabeli
Załóżmy, że mamy tabelę courses:
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
course_name TEXT,
tags TEXT[]
);
INSERT INTO courses (course_name, tags)
VALUES
('Algorytmy', ARRAY['Programowanie', 'Informatyka']),
('Algebra liniowa', ARRAY['Matematyka', 'Algebra']),
('Podstawy fizyki', ARRAY['Fizyka', 'Ogólna']);
Teraz wyciągniemy wszystkie tagi z tablicy:
SELECT course_name, unnest(tags) AS tag
FROM courses;
Wynik:
| course_name | tag |
|---|---|
| Algorytmy | Programowanie |
| Algorytmy | Informatyka |
| Algebra liniowa | Matematyka |
| Algebra liniowa | Algebra |
| Podstawy fizyki | Fizyka |
| Podstawy fizyki | Ogólna |
Widzisz, każdy element tablicy zamienia się w osobny wiersz tabeli.
Funkcja array_length(): sprawdzamy rozmiar tablicy
Drugą ważną funkcją do pracy z tablicami jest array_length(). Zwraca ona długość tablicy (czyli liczbę elementów) dla podanego wymiaru.
Przykład 1: Liczba elementów w jednowymiarowej tablicy
Weźmy tablicę:
SELECT ARRAY['Jabłko', 'Banan', 'Pomarańcza'] AS owoce;
Jeśli chcemy sprawdzić, ile owoców jest w tablicy:
SELECT array_length(ARRAY['Jabłko', 'Banan', 'Pomarańcza'], 1) AS dlugosc;
Wynik:
| dlugosc |
|---|
| 3 |
Tutaj 1 oznacza wymiar tablicy. Tablice w PostgreSQL mogą mieć kilka wymiarów (np. dwuwymiarowe), ale o tym pogadamy innym razem.
Przykład 2: Liczba elementów w tablicy w tabeli
Zobaczmy, ile tagów ma każdy kurs:
SELECT course_name, array_length(tags, 1) AS liczba_tagow
FROM courses;
Wynik:
| course_name | liczba_tagow |
|---|---|
| Algorytmy | 2 |
| Algebra liniowa | 2 |
| Podstawy fizyki | 2 |
Funkcja po prostu mówi: „Hej, tu są dwa elementy!” — i to już mega ułatwia analizę danych.
Funkcja array_position(): szukanie wartości w tablicy
Wyobraź sobie, że szukasz konkretnego elementu w tablicy. Funkcja array_position() przychodzi z pomocą: zwraca pozycję pierwszego wystąpienia elementu.
Przykład 1: Szukanie elementu
Załóżmy, że mamy tablicę:
SELECT ARRAY['Czerwony', 'Niebieski', 'Zielony', 'Żółty'] AS kolory;
Spróbujmy znaleźć pozycję elementu "Niebieski":
SELECT array_position(ARRAY['Czerwony', 'Niebieski', 'Zielony', 'Żółty'], 'Niebieski') AS pozycja;
Wynik:
| pozycja |
|---|
| 2 |
Jeśli elementu nie ma, funkcja zwraca NULL. Sprawdźmy:
SELECT array_position(ARRAY['Czerwony', 'Niebieski', 'Zielony', 'Żółty'], 'Czarny') AS pozycja;
Wynik:
| pozycja |
|---|
| NULL |
Przykład 2: Szukanie w tablicy w tabeli
Chcesz sprawdzić, który kurs ma tag "Informatyka". Najpierw znajdźmy odpowiednie wiersze:
SELECT course_name, array_position(tags, 'Informatyka') AS pozycja
FROM courses;
Wynik:
| course_name | pozycja |
|---|---|
| Algorytmy | 2 |
| Algebra liniowa | NULL |
| Podstawy fizyki | NULL |
Teraz dodaj filtr, żeby zostawić tylko te wiersze, gdzie tag istnieje:
SELECT course_name
FROM courses
WHERE array_position(tags, 'Informatyka') IS NOT NULL;
Wynik:
| course_name |
|---|
| Algorytmy |
Funkcja array_position() pozwala szybko znaleźć dane w tablicy, więc jest jedną z kluczowych do pracy z tablicami w PostgreSQL.
Praktyczne zastosowanie funkcji
unnest()— używaj do zamiany tablic na wiersze. To ważne przy analizie danych, robieniu raportów i pracy z tagami.array_length()— idealna do sprawdzania długości tablic. Na przykład możesz jej użyć do walidacji danych: sprawdzać, czy tablica nie jest pusta.array_position()— świetne narzędzie do szukania elementów, czy to kategorie produktów, udział studenta w projekcie, czy słowa kluczowe w opisie.
Typowe błędy przy użyciu funkcji
unnest()może podwoić liczbę wierszy, jeśli używasz jej na tablicach w kilku kolumnach naraz. Łatwo to ogarnąć przezJOIN LATERALalboCROSS JOIN, ale bądź czujny.array_length()zwracaNULLdla pustej tablicy. Jeśli twoja tablica może być pusta, sprawdzaj to osobno.array_position()może zwrócićNULL, jeśli elementu nie ma. Dlatego zawsze warto brać to pod uwagę w filtrach (IS NOT NULL).
Przykłady z realnej praktyki
Tablice w PostgreSQL to nie tylko teoria, ale narzędzie, które świetnie sprawdza się w prawdziwych projektach. Na przykład prowadzisz bloga i każdy artykuł ma listę tagów — tablica pozwala łatwo filtrować artykuły po temacie albo nawet zrobić top popularnych kategorii.
Albo analizujesz zachowania użytkowników, którzy wybierają kilka interesujących ich kursów czy produktów. Wszystkie te preferencje wygodnie trzymać w tablicy — i tak samo wygodnie je obrabiać.
A jeszcze tablice pomagają walidować dane: dzięki array_length() możesz np. ograniczyć liczbę elementów — żeby użytkownik nie wybrał więcej niż pięć opcji.
GO TO FULL VERSION