CodeGym /Kursy /SQL SELF /Wyciąganie danych z tablicy: unnest(), array_length(), ...

Wyciąganie danych z tablicy: unnest(), array_length(), array_position()

SQL SELF
Poziom 35, Lekcja 2
Dostępny

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

  1. unnest() może podwoić liczbę wierszy, jeśli używasz jej na tablicach w kilku kolumnach naraz. Łatwo to ogarnąć przez JOIN LATERAL albo CROSS JOIN, ale bądź czujny.
  2. array_length() zwraca NULL dla pustej tablicy. Jeśli twoja tablica może być pusta, sprawdzaj to osobno.
  3. 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.

2
Zadanie
SQL SELF, poziom 35, lekcja 2
Niedostępne
Rozpakowywanie tablicy za pomocą `unnest()`
Rozpakowywanie tablicy za pomocą `unnest()`
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION