CodeGym /Các khóa học /SQL SELF /Giới thiệu về các cấu trúc điều khiển: IF, CASE, RETURN

Giới thiệu về các cấu trúc điều khiển: IF, CASE, RETURN

SQL SELF
Mức độ , Bài học
Có sẵn

Các cấu trúc điều khiển là nền tảng của bất kỳ chương trình nào, dù là SQL script, Python code hay thậm chí là robot trên Sao Hoả đang suy nghĩ xem có nên gửi tín hiệu về nhà hay đi tìm sự sống ở góc miệng núi lửa.

Trong PL/pgSQL, các cấu trúc điều khiển giúp tụi mình:

  • Thực hiện một số hành động nhất định nếu điều kiện đúng.
  • Kiểm soát thứ tự thực thi code.
  • Xây dựng logic quyết định.

Bạn có thể tưởng tượng chúng như biển báo giao thông trên đường: "Nếu thấy STOP thì dừng lại. Nếu thấy đèn xanh — cứ đi thôi!"

Những cấu trúc điều khiển phổ biến nhất trong PL/pgSQL:

  • IF – kiểm tra điều kiện và thực hiện lệnh tương ứng.
  • CASE – thay thế cho IF khi có nhiều điều kiện.
  • RETURN – kết thúc function và trả về kết quả.

Bạn chắc cũng đã nghe qua về chúng rồi. Sau khi học các ngôn ngữ lập trình khác thì hiểu mấy cái này cũng dễ thôi mà.

Toán tử điều kiện IF

Toán tử IF dùng để thực thi code chỉ khi điều kiện nào đó là TRUE (đúng). Đây là cấu trúc cơ bản của nó:

IF điều_kiện THEN
  -- Code sẽ chạy nếu điều kiện đúng.
ELSE
  -- Code thay thế nếu điều kiện sai.
END IF;

Viết thử một function nhận vào một số và trả về nó là số chẵn hay lẻ nhé:

CREATE OR REPLACE FUNCTION check_even_odd(num INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF num % 2 = 0 THEN
    RETURN 'Số chẵn';
  ELSE
    RETURN 'Số lẻ';
  END IF;
END;
$$ LANGUAGE plpgsql;

Giờ test thử nè:

SELECT check_even_odd(4); -- Số chẵn
SELECT check_even_odd(7); -- Số lẻ

Giải thích nhanh: IF num % 2 = 0 THEN kiểm tra xem số có chia hết cho 2 không.

Điều kiện ELSIF

Đôi khi một điều kiện là chưa đủ, bạn cần kiểm tra nhiều điều kiện. Đó là lúc ELSIF xuất hiện.

Giả sử mình có một function trả về nhận xét về nhiệt độ:

CREATE OR REPLACE FUNCTION temperature_comment(temp INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF temp < 0 THEN
    RETURN 'Rất lạnh!';
  ELSIF temp >= 0 AND temp <= 20 THEN
    RETURN 'Mát mẻ';
  ELSE
    RETURN 'Ấm áp!';
  END IF;
END;
$$ LANGUAGE plpgsql;

Test thử nhé:

SELECT temperature_comment(-5);  -- Rất lạnh!
SELECT temperature_comment(15);  -- Mát mẻ
SELECT temperature_comment(25);  -- Ấm áp!

Cú pháp CASE

Nếu bạn có nhiều điều kiện, toán tử CASE là cứu tinh luôn. Nó hơi giống IF, nhưng "ngầu" hơn chút.

CASE
  WHEN điều_kiện_1 THEN giá_trị_1
  WHEN điều_kiện_2 THEN giá_trị_2
  ELSE giá_trị_mặc_định
END;

Tạo function trả về nhận xét dựa trên điểm số nhé:

CREATE OR REPLACE FUNCTION grade_comment(score INTEGER)
RETURNS TEXT AS $$
BEGIN
  RETURN CASE
    WHEN score >= 90 THEN 'Xuất sắc'
    WHEN score >= 75 THEN 'Tốt'
    WHEN score >= 50 THEN 'Đạt'
    ELSE 'Không đạt'
  END;
END;
$$ LANGUAGE plpgsql;

Test thử nè:

SELECT grade_comment(95); -- Xuất sắc
SELECT grade_comment(80); -- Tốt
SELECT grade_comment(45); -- Không đạt

Lưu ý: khác với IF, CASE trả về giá trị, nên bạn có thể dùng RETURN ngay trong CASE.

Toán tử RETURN

RETURN kết thúc function và trả về giá trị. Cái này cực kỳ quan trọng với function trong PL/pgSQL, vì nó bắt buộc phải trả về gì đó (ví dụ text, số, v.v.).

Xem thử RETURN hoạt động thế nào với ví dụ đơn giản:

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

Kết quả:

SELECT return_example(); -- Hello, World!

Nhưng nếu có nhiều nhánh code thì sao? Ví dụ kiểm tra dữ liệu đầu vào. Khi đó RETURN sẽ nằm ở nhiều chỗ trong function:

CREATE OR REPLACE FUNCTION check_positive_negative(num INTEGER)
RETURNS TEXT AS $$
BEGIN
  IF num > 0 THEN
    RETURN 'Số dương';
  ELSIF num = 0 THEN
    RETURN 'Số không';
  ELSE
    RETURN 'Số âm';
  END IF;
END;
$$ LANGUAGE plpgsql;

Test thử nhé:

SELECT check_positive_negative(10); -- Số dương
SELECT check_positive_negative(0);  -- Số không
SELECT check_positive_negative(-5); -- Số âm

Lỗi phổ biến và dễ bị nhầm lẫn

  1. Quên toán tử END: quên END CASE; hoặc END IF; là PostgreSQL sẽ nhắc bạn ngay phải kết thúc block code.
  2. Lỗi logic khi dùng ELSIF: thứ tự điều kiện rất quan trọng! Điều kiện tổng quát (temp > 0) không nên đặt trước điều kiện cụ thể hơn (temp > 20).
  3. Quên RETURN: trong PL/pgSQL, function bắt buộc phải trả về gì đó nếu bạn đã khai báo RETURNS.

Vậy là xong rồi đó. Tụi mình vừa học xong cơ bản về các cấu trúc điều khiển và logic trong PL/pgSQL. Kiến thức này sẽ cực kỳ hữu ích khi bạn viết function phức tạp hơn! Lần sau tụi mình sẽ học về vòng lặp và cách dùng chúng nhé.

2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Phân tích nhiệt độ với điều kiện `IF` và `RETURN`
Phân tích nhiệt độ với điều kiện `IF` và `RETURN`
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION