CodeGym /Kurslar /SQL SELF /İdarəedici konstruksiyalara giriş: IF, CASE, RETURN

İdarəedici konstruksiyalara giriş: IF, CASE, RETURN

SQL SELF
Səviyyə , Dərs
Mövcuddur

İdarəedici konstruksiyalar — istənilən proqramın əsas hissəsidir, fərqi yoxdur SQL script, Python kodu və ya Marsda olan robot olsun, hansı ki, düşünür: evə siqnal göndərsin, ya da kraterin küncündə həyat axtarsın.

PL/pgSQL-də idarəedici konstruksiyalar bizə kömək edir:

  • Əgər şərt doğrudursa, müəyyən əməliyyatları yerinə yetirmək.
  • Kodun icra ardıcıllığını idarə etmək.
  • Qərar qəbul etmə məntiqini qurmaq.

Bunları yolda olan yol nişanları kimi təsəvvür edə bilərsən: "Əgər STOP görürsənsə, dayan. Əgər yaşıl işıqdırsa — hərəkət et!"

PL/pgSQL-də ən məşhur idarəedici konstruksiyalar:

  • IF – şərti yoxlayır və uyğun əmrləri icra edir.
  • CASE – çoxlu şərt olanda IF-ə alternativdir.
  • RETURN – funksiyanın icrasını bitirir və nəticəni qaytarır.

Artıq bunlar barədə təsəvvürün var. Proqramlaşdırma dillərindən sonra bunları başa düşmək lap asan olacaq.

IF şərt operatoru

IF operatoru kodu yalnız müəyyən şərt TRUE (doğrudur) olduqda icra etmək üçün istifadə olunur. Onun əsas strukturu belədir:

IF şərt THEN
  -- Şərt doğrudursa icra olunan kod.
ELSE
  -- Əks halda icra olunan alternativ kod.
END IF;

Bir funksiya yazaq, hansı ki, bir ədəd qəbul edir və onun cüt ya tək olduğunu qaytarır:

CREATE OR REPLACE FUNCTION check_even_odd(num INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF num % 2 = 0 THEN
    RETURN 'Ədəd cütdür';
  ELSE
    RETURN 'Ədəd təkdir';
  END IF;
END;
$$ LANGUAGE plpgsql;

İndi bunu test edək:

SELECT check_even_odd(4); -- Ədəd cütdür
SELECT check_even_odd(7); -- Ədəd təkdir

Qısa izah: IF num % 2 = 0 THEN yoxlayır ki, ədəd 2-yə qalıqsız bölünürmü.

ELSIF şərti

Bəzən bir yoxlama kifayət etmir və bir neçə şərti yoxlamaq lazımdır. Bunun üçün ELSIF var.

Tutaq ki, bizdə temperatur haqqında mətn mesajı qaytaran funksiya var:

CREATE OR REPLACE FUNCTION temperature_comment(temp INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF temp < 0 THEN
    RETURN 'Çox soyuqdur!';
  ELSIF temp >= 0 AND temp <= 20 THEN
    RETURN 'Sərin';
  ELSE
    RETURN 'İstidır!';
  END IF;
END;
$$ LANGUAGE plpgsql;

Test edirik:

SELECT temperature_comment(-5);  -- Çox soyuqdur!
SELECT temperature_comment(15);  -- Sərin
SELECT temperature_comment(25);  -- İstidır!

CASE sintaksisi

Əgər çoxlu şərtin varsa, CASE operatoru səni xilas edəcək. O, bir az IF-ə oxşayır, amma daha "elegantdır".

CASE
  WHEN şərt_1 THEN dəyər_1
  WHEN şərt_2 THEN dəyər_2
  ELSE default_dəyər
END;

Bir funksiya yaradaq, hansı ki, ədədə əsasən mətn qiymətləndirməsi qaytarır:

CREATE OR REPLACE FUNCTION grade_comment(score INTEGER)
RETURNS TEXT AS $$
BEGIN
  RETURN CASE
    WHEN score >= 90 THEN 'Əla'
    WHEN score >= 75 THEN 'Yaxşı'
    WHEN score >= 50 THEN 'Qənaətbəxş'
    ELSE 'Qeyri-qənaətbəxş'
  END;
END;
$$ LANGUAGE plpgsql;

Test edirik:

SELECT grade_comment(95); -- Əla
SELECT grade_comment(80); -- Yaxşı
SELECT grade_comment(45); -- Qeyri-qənaətbəxş

Qeyd: IF-dən fərqli olaraq, CASE dəyər qaytarır, ona görə də RETURN operatorunu birbaşa CASE içində istifadə etmək olar.

RETURN operatoru

RETURN funksiyanın icrasını bitirir və dəyəri qaytarır. Bu, PL/pgSQL-də funksiyalar üçün kritikdir, çünki onlar mütləq nəsə qaytarmalıdır (məsələn, mətn, ədəd və s.).

Gəlin, RETURN-un necə işlədiyinə ən sadə nümunədə baxaq:

CREATE OR REPLACE FUNCTION return_example()
RETURNS TEXT AS $$
BEGIN
  RETURN 'Salam, Dünya!';
END;
$$ LANGUAGE plpgsql;

Nəticə:

SELECT return_example(); -- Salam, Dünya!

Bəs birdən bir neçə kod budağımız olsa? Məsələn, daxil olan verilənləri yoxlamaq. Onda RETURN funksiyanın müxtəlif yerlərində istifadə olunacaq:

CREATE OR REPLACE FUNCTION check_positive_negative(num INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF num > 0 THEN
    RETURN 'Müsbət ədəd';
  ELSIF num = 0 THEN
    RETURN 'Sıfır';
  ELSE
    RETURN 'Mənfi ədəd';
  END IF;
END;
$$ LANGUAGE plpgsql;

Test edirik:

SELECT check_positive_negative(10); -- Müsbət ədəd
SELECT check_positive_negative(0);  -- Sıfır
SELECT check_positive_negative(-5); -- Mənfi ədəd

Tipik səhvlər və harada çaşmaq olar

  1. END operatorunu unutmaq: END CASE; və ya END IF; yazmağı unutsan, PostgreSQL dərhal kod blokunu bitirməyi tələb edəcək.
  2. ELSIF istifadə edərkən məntiqi səhvlər: şərtlərin ardıcıllığı vacibdir! Daha ümumi şərt (temp > 0) daha spesifik şərtdən (temp > 20) əvvəl gəlməməlidir.
  3. RETURN-u unutmaq: PL/pgSQL-də funksiya mütləq nəsə qaytarmalıdır, əgər RETURNS elan etmisənsə.

Bu qədər. Biz PL/pgSQL-də idarəedici konstruksiyaların və məntiqin əsaslarını öyrəndik. Bu biliklər sənə daha mürəkkəb funksiyalar yazanda lazım olacaq! Növbəti dəfə dövrlər və onların istifadəsinə baxacağıq.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION