CodeGym /Kursy /SQL SELF /Wprowadzenie do konstrukcji sterujących: IF, CASE, RETURN...

Wprowadzenie do konstrukcji sterujących: IF, CASE, RETURN

SQL SELF
Poziom 51 , Lekcja 0
Dostępny

Konstrukcje sterujące to podstawa każdego programu, czy to SQL-script, Python-code, czy nawet robot na Marsie, który się zastanawia, czy wysłać sygnał do domu, czy poszukać życia za rogiem krateru.

W PL/pgSQL konstrukcje sterujące pomagają nam:

  • Wykonywać konkretne akcje, jeśli warunki są spełnione.
  • Kontrolować kolejność wykonywania kodu.
  • Realizować logikę podejmowania decyzji.

Możesz je sobie wyobrazić jak znaki drogowe: "Jeśli widzisz STOP, zatrzymaj się. Jeśli widzisz zielone światło — jedź!"

Najpopularniejsze konstrukcje sterujące w PL/pgSQL:

  • IF – sprawdza warunek i wykonuje odpowiednie polecenia.
  • CASE – alternatywa dla IF, kiedy warunków jest dużo.
  • RETURN – kończy działanie funkcji i zwraca wynik.

Już coś o nich wiesz. No i po innych językach programowania ogarniesz je bez problemu.

Operator warunkowy IF

Operator IF używamy, żeby wykonać kod tylko wtedy, gdy jakiś warunek jest TRUE (prawda). Oto jego podstawowa struktura:

IF warunek THEN
  -- Kod, który się wykona, jeśli warunek jest prawdziwy.
ELSE
  -- Alternatywny kod, jeśli warunek jest fałszywy.
END IF;

Napiszemy funkcję, która przyjmuje liczbę i zwraca, czy jest parzysta czy nieparzysta:

CREATE OR REPLACE FUNCTION check_even_odd(num INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF num % 2 = 0 THEN
    RETURN 'Liczba parzysta';
  ELSE
    RETURN 'Liczba nieparzysta';
  END IF;
END;
$$ LANGUAGE plpgsql;

Teraz ją przetestujemy:

SELECT check_even_odd(4); -- Liczba parzysta
SELECT check_even_odd(7); -- Liczba nieparzysta

Krótkie wyjaśnienie: IF num % 2 = 0 THEN sprawdza, czy liczba dzieli się przez 2 bez reszty.

Warunek ELSIF

Czasem jedna kontrola nie wystarczy i trzeba sprawdzić kilka warunków. Do tego jest ELSIF.

Załóżmy, że mamy funkcję, która zwraca tekstowy komentarz o temperaturze:

CREATE OR REPLACE FUNCTION temperature_comment(temp INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF temp < 0 THEN
    RETURN 'Bardzo zimno!';
  ELSIF temp >= 0 AND temp <= 20 THEN
    RETURN 'Chłodno';
  ELSE
    RETURN 'Ciepło!';
  END IF;
END;
$$ LANGUAGE plpgsql;

Testujemy:

SELECT temperature_comment(-5);  -- Bardzo zimno!
SELECT temperature_comment(15);  -- Chłodno
SELECT temperature_comment(25);  -- Ciepło!

Składnia CASE

Jeśli masz dużo warunków, operator CASE ratuje życie. Trochę przypomina IF, ale jest bardziej "elegancki".

CASE
  WHEN warunek_1 THEN wartosc_1
  WHEN warunek_2 THEN wartosc_2
  ELSE wartosc_domyslna
END;

Stwórzmy funkcję, która zwraca tekstową ocenę na podstawie liczby:

CREATE OR REPLACE FUNCTION grade_comment(score INTEGER)
RETURNS TEXT AS $$
BEGIN
  RETURN CASE
    WHEN score >= 90 THEN 'Celująco'
    WHEN score >= 75 THEN 'Dobrze'
    WHEN score >= 50 THEN 'Dostatecznie'
    ELSE 'Niedostatecznie'
  END;
END;
$$ LANGUAGE plpgsql;

Testujemy:

SELECT grade_comment(95); -- Celująco
SELECT grade_comment(80); -- Dobrze
SELECT grade_comment(45); -- Niedostatecznie

Uwaga: w przeciwieństwie do IF, CASE zwraca wartość, więc operator RETURN można użyć bezpośrednio w CASE.

Operator RETURN

RETURN kończy działanie funkcji i zwraca wartość. To mega ważne w funkcjach PL/pgSQL, które muszą coś zwracać (np. tekst, liczbę itd.).

Zobaczmy, jak działa RETURN na prostym przykładzie:

CREATE OR REPLACE FUNCTION return_example()
RETURNS TEXT AS $$
BEGIN
  RETURN 'Hello, World!';
END;
$$ LANGUAGE plpgsql;

Wynik:

SELECT return_example(); -- Hello, World!

A co jeśli mamy kilka ścieżek kodu? Na przykład sprawdzanie danych wejściowych. Wtedy RETURN pojawi się w różnych miejscach funkcji:

CREATE OR REPLACE FUNCTION check_positive_negative(num INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF num > 0 THEN
    RETURN 'Liczba dodatnia';
  ELSIF num = 0 THEN
    RETURN 'Zero';
  ELSE
    RETURN 'Liczba ujemna';
  END IF;
END;
$$ LANGUAGE plpgsql;

Testujemy:

SELECT check_positive_negative(10); -- Liczba dodatnia
SELECT check_positive_negative(0);  -- Zero
SELECT check_positive_negative(-5); -- Liczba ujemna

Typowe błędy i gdzie można się pogubić

  1. Pominięcie operatora END: zapomnisz END CASE; albo END IF; i PostgreSQL od razu przypomni ci, że trzeba zamknąć blok kodu.
  2. Błędy logiczne przy użyciu ELSIF: kolejność warunków jest ważna! Bardziej ogólny warunek (temp > 0) nie powinien być przed bardziej szczegółowym (temp > 20).
  3. Zapomniałeś o RETURN: w PL/pgSQL funkcja musi coś zwracać, jeśli zadeklarowałeś RETURNS.

To wszystko na dziś. Omówiliśmy podstawy konstrukcji sterujących i logiki w PL/pgSQL. Ta wiedza przyda ci się w praktyce przy tworzeniu bardziej zaawansowanych funkcji! Następnym razem ogarniemy pętle i ich użycie.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION