IF ELSE trong thủ tục lưu sẵn MySQL

Hướng dẫn MySQL này giải thích cách sử dụng câu lệnh IF-THEN-ELSE trong MySQL với cú pháp và ví dụ

Sự miêu tả

Trong MySQL, câu lệnh IF-THEN-ELSE được sử dụng để thực thi mã khi điều kiện là TRUE hoặc thực thi mã khác nếu điều kiện ước tính là FALSE

cú pháp

Cú pháp của câu lệnh IF-THEN-ELSE trong MySQL là

IF condition1 THEN
   {...statements to execute when condition1 is TRUE...}

[ ELSEIF condition2 THEN
   {...statements to execute when condition1 is FALSE and condition2 is TRUE...} ]

[ ELSE
   {...statements to execute when both condition1 and condition2 are FALSE...} ]

END IF;
ELSEIFTùy chọn. Bạn sẽ sử dụng điều kiện ELSEIF khi bạn muốn thực hiện một tập hợp các câu lệnh khi điều kiện thứ hai (nghĩa là. điều kiện2) là ĐÚNG. KHÁCTùy chọn. Bạn sẽ sử dụng điều kiện ELSE khi bạn muốn thực thi một tập hợp các câu lệnh khi không có điều kiện IF hoặc ELSEIF nào được đánh giá là TRUE

Ghi chú

  • Khi một điều kiện được tìm thấy là TRUE, câu lệnh IF-THEN-ELSE sẽ thực thi mã tương ứng và không đánh giá các điều kiện nữa
  • Nếu không có điều kiện nào được đáp ứng, phần ELSE của câu lệnh IF-THEN-ELSE sẽ được thực thi
  • Điều quan trọng cần lưu ý là các phần ELSEIF và ELSE là tùy chọn

Ví dụ

Sau đây là ví dụ sử dụng câu lệnh IF-THEN-ELSE trong hàm MySQL

DELIMITER //

CREATE FUNCTION IncomeLevel ( monthly_value INT )
RETURNS varchar(20)

BEGIN

   DECLARE income_level varchar(20);

   IF monthly_value <= 4000 THEN
      SET income_level = 'Low Income';

   ELSEIF monthly_value > 4000 AND monthly_value <= 7000 THEN
      SET income_level = 'Avg Income';

   ELSE
      SET income_level = 'High Income';

   END IF;

   RETURN income_level;

END; //

DELIMITER ;

Trong ví dụ về câu lệnh IF-THEN-ELSE này, chúng ta đã tạo một hàm gọi là IncomeLevel. Nó có một tham số được gọi là daily_value và nó trả về một varchar(20). Hàm sẽ trả về mức thu nhập dựa trên giá_trị_tháng

Câu lệnh IF được sử dụng trong các chương trình được lưu trữ triển khai cấu trúc điều kiện cơ bản trong MySQL. Dựa trên một điều kiện nào đó, nó cho phép chúng ta thực hiện một tập hợp các câu lệnh SQL. Nó trả về một trong ba giá trị Đúng, Sai hoặc NULL

Chúng ta có thể sử dụng câu lệnh này theo ba cách mệnh đề IF-THEN, IF-THEN-ELSE, IF-THEN-ELSEIF-ELSE và có thể kết thúc bằng END-IF. Chúng ta hãy xem chi tiết từng tuyên bố này

Câu lệnh IF-THEN

Câu lệnh này thực thi một tập hợp các truy vấn SQL dựa trên các điều kiện hoặc biểu thức nhất định. Cú pháp của câu lệnh IF-THEN như sau

Trong cú pháp trên, chúng ta phải chỉ định một điều kiện để thực thi mã. Nếu câu lệnh được đánh giá là đúng, nó sẽ thực thi câu lệnh giữa IF-THEN và END-IF. Nếu không, nó sẽ thực hiện câu lệnh sau END-IF

Ví dụ

NẾU. Khối ENDIF thực thi với các chương trình được lưu trữ và kết thúc bằng dấu chấm phẩy, như trong ví dụ bên dưới

Tiếp theo, lấy hai biến và đặt giá trị cho cả hai như bên dưới

Bây giờ, gọi hàm thủ tục lưu trữ để kiểm tra đầu ra

Chúng tôi sẽ nhận được đầu ra sau

IF ELSE trong thủ tục lưu sẵn MySQL

Câu lệnh IF-THEN-ELSE

Nếu chúng ta muốn thực hiện các câu lệnh khác khi điều kiện chỉ định trong khối IF không được đánh giá là đúng, thì có thể sử dụng câu lệnh này. Cú pháp của câu lệnh IF-THEN-ELSE được đưa ra dưới đây

Trong cú pháp trên, chúng ta phải chỉ định một điều kiện để thực thi mã. Nếu câu lệnh được đánh giá là đúng, nó sẽ thực thi câu lệnh giữa IF-THEN và ELSE. Ngược lại, nó sẽ thực thi câu lệnh sau ELSE và END-IF

Hãy để chúng tôi sửa đổi thủ tục được lưu trữ myResult() ở trên. Vì vậy, trước tiên, hãy xóa thủ tục lưu trữ myResult() bằng cách sử dụng lệnh bên dưới

Điều khiển có điều kiện—hoặc “luồng điều khiển”—các câu lệnh cho phép bạn thực thi mã dựa trên giá trị của một số biểu thức. Như chúng tôi đã nói trước đó, một biểu thức có thể là bất kỳ sự kết hợp nào giữa các ký tự, biến, toán tử và hàm MySQL trả về một giá trị. Các câu lệnh điều khiển có điều kiện cho phép bạn thực hiện các hành động khác nhau tùy thuộc vào giá trị của một biểu thức như vậy, biểu thức này có thể tham chiếu đến các tham số của chương trình được lưu trữ, dữ liệu trong cơ sở dữ liệu hoặc dữ liệu biến khác (chẳng hạn như ngày trong tuần hoặc thời gian).

Ngôn ngữ chương trình được lưu trữ MySQL hỗ trợ hai câu lệnh điều khiển có điều kiện.

IF expression THEN
    statements
END IF;
4 và
IF expression THEN
    statements
END IF;
5. Cả
IF expression THEN
    statements
END IF;
4 và
IF expression THEN
    statements
END IF;
5 đều thực hiện các chức năng rất giống nhau và luôn có cách để viết lại câu lệnh
IF expression THEN
    statements
END IF;
4 thành câu lệnh
IF expression THEN
    statements
END IF;
5 hoặc ngược lại. Thông thường, việc lựa chọn giữa
IF expression THEN
    statements
END IF;
4 và
IF expression THEN
    statements
END IF;
5 là vấn đề sở thích cá nhân hoặc tiêu chuẩn lập trình. Tuy nhiên, có những trường hợp trong đó một loại tuyên bố dễ đọc hơn hoặc hiệu quả hơn loại kia

Các tiểu mục sau đây mô tả cú pháp của cả hai câu lệnh, cung cấp các ví dụ sử dụng và cuối cùng là so sánh ưu và nhược điểm của từng câu lệnh

Tất cả các lập trình viên sẽ quen thuộc với một số biến thể của câu lệnh

IF expression THEN
    statements
END IF;
4 và việc triển khai câu lệnh
IF expression THEN
    statements
END IF;
4 của MySQL không có gì ngạc nhiên. Cú pháp của
IF expression THEN
    statements
END IF;
4 trong các chương trình được lưu trữ là

    IF expression THEN commands
        [ELSEIF expression THEN commands ....]
        [ELSE commands]
    END IF;

ĐÚNG hay SAI (hoặc không)?

Các lệnh được liên kết với các câu lệnh

IF expression THEN
    statements
END IF;
4 hoặc
IF sale_value > 200 THEN 

    CALL apply_free_shipping(sale_id);
END IF 
;
6 sẽ chỉ được thực thi nếu biểu thức được liên kết ước tính là TRUE. Các biểu thức như 1=1 hoặc 2>1 sẽ đánh giá là TRUE. Các biểu thức như 1>3 sẽ đánh giá là FALSE

Tuy nhiên, nếu bạn đang thực hiện một thao tác trên một hoặc nhiều biến và một trong các biến có giá trị NULL, thì kết quả của biểu thức có thể là NULL—không phải TRUE cũng không phải FALSE. Điều này có thể dẫn đến một số kết luận sai lầm nếu mã của bạn giả định rằng các biểu thức không TRUE nhất thiết phải là FALSE hoặc ngược lại. Vì vậy, ví dụ: trong , nếu chúng tôi không thể tìm thấy '_______15_______7' hoặc '

IF sale_value > 200 THEN 

    CALL apply_free_shipping(sale_id);
END IF 
;
8' trong chuỗi phiên bản, chúng tôi cho rằng bản phát hành đó đang được sản xuất. Tuy nhiên, nếu
IF sale_value > 200 THEN 

    CALL apply_free_shipping(sale_id);
END IF 
;
9 là NULL, thì điều kiện
IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
0 sẽ luôn kích hoạt, mặc dù chúng tôi thực sự không có cơ sở để đưa ra bất kỳ khẳng định nào như vậy

Ví dụ 4-5. Giả định sai rằng NOT TRUE = FALSE

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;

Mẹo

Đừng cho rằng kết quả của một biểu thức là TRUE hoặc FALSE. Nó cũng có thể đánh giá là NULL (UNKNOWN) nếu bất kỳ biến tham gia nào là NULL

Cũng lưu ý rằng bất kỳ biểu thức nào trả về giá trị số—hoặc chuỗi trông giống như số—có thể cho kết quả TRUE, FALSE hoặc NULL. các quy tắc là

  • Nếu giá trị tuyệt đối của một biểu thức số là 1 hoặc lớn hơn, thì nó sẽ được đánh giá là TRUE bởi câu lệnh

    IF expression THEN
        statements
    END IF;
    4 hoặc
    IF sale_value > 200 THEN 
    
        CALL apply_free_shipping(sale_id);
    END IF 
    ;
    6. Lưu ý rằng thuật ngữ “giá trị tuyệt đối” có nghĩa là cả 1 và -1 sẽ đánh giá là TRUE

  • Nếu giá trị của biểu thức số là 0, thì nó sẽ đánh giá là FALSE

Kết hợp NẾU-THEN đơn giản

Ở dạng đơn giản nhất,

IF expression THEN
    statements
END IF;
4 có thể được sử dụng để chỉ định một tập hợp các câu lệnh chỉ thực hiện nếu một điều kiện được đánh giá là TRUE. Cú pháp của loại câu lệnh
IF expression THEN
    statements
END IF;
4 này như sau

IF expression THEN
    statements
END IF;

hiển thị một câu lệnh

IF expression THEN
    statements
END IF;
4 đơn giản

Ví dụ 4-6. Ví dụ về câu lệnh IF đơn giản

IF sale_value > 200 THEN 

    CALL apply_free_shipping(sale_id);
END IF 
;

Chúng ta có thể bao gồm nhiều câu lệnh giữa các mệnh đề

IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
6 và
IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
7, như trong

Ví dụ 4-7. Câu lệnh IF nhiều câu lệnh

IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;

Như đã trình bày trong phần , chúng ta cũng có thể bao gồm bất kỳ câu lệnh thực thi nào khác bên trong câu lệnh

IF expression THEN
    statements
END IF;
4, chẳng hạn như các cấu trúc vòng lặp, câu lệnh
IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
9 và các câu lệnh
IF expression THEN
    statements
END IF;
4 khác (mặc dù, như chúng ta sẽ thấy sau này, tốt nhất là tránh lồng các câu lệnh
IF expression THEN
    statements
END IF;
4 theo cách này nếu

Ví dụ 4-8. Câu lệnh IF lồng nhau

IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    IF sale_value > 500 THEN
        CALL apply_discount(sale_id,20);
    END IF;
END IF;

Không cần thiết phải ngắt câu lệnh

IF expression THEN
    statements
END IF;
4 trên nhiều dòng;

Ví dụ 4-9. Định dạng thay thế cho câu lệnh IF

IF sale_value > 200 THEN CALL apply_free_shipping(sale_id); END IF;


IF sale_value > 200
THEN
    CALL apply_free_shipping(sale_id);
END IF;


IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
END IF;

Có thể đặt một câu lệnh

IF expression THEN
    statements
END IF;
4 rất đơn giản trên một dòng, nhưng chắc chắn không phải là cách tốt để làm điều này đối với các cấu trúc
IF expression THEN
    statements
END IF;
4 phức tạp hoặc lồng nhau. Chẳng hạn, cái nào dễ đọc, dễ hiểu và dễ bảo trì hơn?

    IF sale_value > 200 THEN
        CALL apply_free_shipping(sale_id);
        IF sale_value > 500 THEN
            CALL apply_discount(sale_id,20);
        END IF;
    END IF;

Hoặc cái này

    IF sale_value > 200 THEN CALL apply_free_shipping(sale_id); IF sale_value >
    500 THEN CALL apply_discount(sale_id,20);END IF;END IF;

Một số lập trình viên muốn đặt mệnh đề

IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
6 trên một dòng riêng, như sau

    IF sale_value > 200
    THEN
        CALL apply_free_shipping(sale_id);
    END IF;

Nhưng đây thực sự là vấn đề sở thích cá nhân và/hoặc tiêu chuẩn lập trình

Mẹo

Đối với bất kỳ câu lệnh

IF expression THEN
    statements
END IF;
4 không cần thiết nào, hãy sử dụng thụt lề và định dạng để đảm bảo rằng logic của câu lệnh
IF expression THEN
    statements
END IF;
4 của bạn dễ hiểu

Việc thêm điều kiện

IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
0 vào câu lệnh
IF expression THEN
    statements
END IF;
4 của bạn cho phép bạn chỉ định câu lệnh sẽ thực thi nếu điều kiện
IF expression THEN
    statements
END IF;
4 KHÔNG ĐÚNG. Chúng tôi sẽ nhấn mạnh một lần nữa—bởi vì nó quan trọng—rằng KHÔNG ĐÚNG không phải lúc nào cũng có nghĩa là SAI. Nếu điều kiện câu lệnh
IF expression THEN
    statements
END IF;
4 đánh giá là NULL, thì câu lệnh
IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
0 sẽ vẫn được thực thi;

Một khối

IF sale_value > 200 THEN CALL apply_free_shipping(sale_id); END IF;


IF sale_value > 200
THEN
    CALL apply_free_shipping(sale_id);
END IF;


IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
END IF;
5 có cú pháp như sau

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
0

Vì vậy, trong , chúng tôi áp dụng phí vận chuyển cho đơn hàng nếu đơn hàng đó dưới $200;

Ví dụ 4-10. Ví dụ IF-THEN ELSE đơn giản

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
1

Câu lệnh IF-THEN-ELSEIF-ELSE

Cú pháp đầy đủ của câu lệnh

IF expression THEN
    statements
END IF;
4 cho phép xác định nhiều điều kiện. Điều kiện đầu tiên đánh giá là TRUE sẽ thực thi. Nếu không có câu nào đánh giá là TRUE, thì mệnh đề
IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
0 (nếu có) sẽ thực thi. Cú pháp của một câu lệnh
IF sale_value > 200 THEN CALL apply_free_shipping(sale_id); END IF;


IF sale_value > 200
THEN
    CALL apply_free_shipping(sale_id);
END IF;


IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
END IF;
8 trông như thế này

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
2

Bạn có thể có bao nhiêu điều kiện

IF sale_value > 200 THEN 

    CALL apply_free_shipping(sale_id);
END IF 
;
6 tùy thích

Các điều kiện không nhất thiết phải loại trừ lẫn nhau. Nghĩa là, nhiều điều kiện có thể đánh giá là TRUE. Điều kiện đầu tiên đánh giá TRUE là điều kiện thực thi. Tạo các điều kiện chồng chéo như thế này có thể hữu ích, nhưng bạn phải rất cẩn thận khi sắp xếp các điều kiện. Chẳng hạn, hãy xem xét câu lệnh

    IF sale_value > 200 THEN
        CALL apply_free_shipping(sale_id);
        IF sale_value > 500 THEN
            CALL apply_discount(sale_id,20);
        END IF;
    END IF;
0 được hiển thị trong

Ví dụ 4-11. Ví dụ về khối IF-ELSEIF với các điều kiện chồng chéo

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
3

Ý định của đoạn mã này là rõ ràng. áp dụng giao hàng miễn phí cho tất cả các đơn hàng trên 200 đô la và thêm chiết khấu 20% cho khách hàng ưu tiên. Tuy nhiên, vì điều kiện đầu tiên sẽ được đánh giá là ĐÚNG cho tất cả các đơn hàng trên 200 đô la, nên điều kiện

IF sale_value > 200 THEN 

    CALL apply_free_shipping(sale_id);
END IF 
;
6 sẽ không được đánh giá cho bất kỳ đơn hàng nào trên 200 đô la và những khách hàng ưu tiên của chúng tôi sẽ không được giảm giá. Không giảm giá cho khách hàng ưu tiên có nghĩa là không có tiền thưởng cuối năm cho lập trình viên thủ tục được lưu trữ của chúng tôi

Có một số cách tốt hơn để viết tuyên bố này. vì một điều, chúng ta có thể chuyển điều kiện

IF sale_value > 200 THEN 

    CALL apply_free_shipping(sale_id);
END IF 
;
6 vào mệnh đề
IF expression THEN
    statements
END IF;
4 để đảm bảo rằng nó được đánh giá trước;

Ví dụ 4-12. Hai cách sửa lỗi logic trong ví dụ trước

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
4

Cả hai lựa chọn thay thế được hiển thị trong đều hoàn toàn hợp lệ. Nói chung, chúng tôi muốn tránh các câu lệnh

IF expression THEN
    statements
END IF;
4 lồng nhau nếu có thể, nhưng nếu có nhiều đánh giá bổ sung mà chúng tôi cần tiến hành khi
    IF sale_value > 200 THEN
        CALL apply_free_shipping(sale_id);
        IF sale_value > 500 THEN
            CALL apply_discount(sale_id,20);
        END IF;
    END IF;
7 lớn hơn $200, thì có thể thực hiện kiểm tra
    IF sale_value > 200 THEN
        CALL apply_free_shipping(sale_id);
        IF sale_value > 500 THEN
            CALL apply_discount(sale_id,20);
        END IF;
    END IF;
7 một lần, sau đó kiểm tra riêng lẻ cho . Vì vậy, giả sử các quy tắc kinh doanh của chúng tôi quy định rằng đối với các đơn hàng trên 200 đô la, chúng tôi sẽ giao hàng miễn phí, cùng với chiết khấu thay đổi dựa trên trạng thái của khách hàng trong chương trình khách hàng thân thiết của chúng tôi. Logic trong một khối
    IF sale_value > 200 THEN
        CALL apply_free_shipping(sale_id);
        IF sale_value > 500 THEN
            CALL apply_discount(sale_id,20);
        END IF;
    END IF;
0 có thể trông giống như được hiển thị trong

Ví dụ 4-13. Khối IF với nhiều điều kiện dư thừa

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
5

Trong trường hợp này, sự lặp lại liên tục của điều kiện

    IF sale_value > 200 THEN
        CALL apply_free_shipping(sale_id);
        IF sale_value > 500 THEN
            CALL apply_discount(sale_id,20);
        END IF;
    END IF;
7 và lệnh gọi
    IF sale_value > 200 THEN CALL apply_free_shipping(sale_id); IF sale_value >
    500 THEN CALL apply_discount(sale_id,20);END IF;END IF;
1 thực sự làm suy yếu khả năng đọc logic của chúng ta—cũng như áp đặt chi phí hoạt động (xem Chương 22). Có thể tốt hơn nếu sử dụng cấu trúc
IF expression THEN
    statements
END IF;
4 lồng nhau để làm rõ rằng mọi người đều được giao hàng miễn phí cho các đơn hàng trên 200 đô la và sau đó chiết khấu chỉ được áp dụng dựa trên trạng thái khách hàng thân thiết. hiển thị triển khai
IF expression THEN
    statements
END IF;
4 lồng nhau

Ví dụ 4-14. Sử dụng IF lồng nhau để tránh đánh giá dư thừa

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
6

Câu lệnh

IF expression THEN
    statements
END IF;
5 là một câu lệnh điều khiển luồng hoặc thực thi có điều kiện thay thế. Bất cứ điều gì có thể được thực hiện với câu lệnh
IF expression THEN
    statements
END IF;
5 đều có thể được thực hiện với câu lệnh
IF expression THEN
    statements
END IF;
4 (và ngược lại), nhưng câu lệnh
IF expression THEN
    statements
END IF;
5 thường dễ đọc và hiệu quả hơn khi cần đánh giá nhiều điều kiện, đặc biệt là khi tất cả các điều kiện đều so sánh kết quả đầu ra từ một biểu thức duy nhất

IF expression THEN
    statements
END IF;
5 tuyên bố có thể có hai hình thức. Câu lệnh đầu tiên—đôi khi được gọi là câu lệnh
IF expression THEN
    statements
END IF;
5 đơn giản—so sánh đầu ra của một biểu thức có nhiều điều kiện

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
7

Cú pháp này hữu ích khi chúng ta đang kiểm tra đầu ra của một số biểu thức dựa trên một tập hợp các giá trị riêng biệt. Chẳng hạn, chúng ta có thể kiểm tra trạng thái trung thành của khách hàng từ ví dụ trước bằng cách sử dụng câu lệnh

IF expression THEN
    statements
END IF;
5 đơn giản được hiển thị trong

Ví dụ 4-15. Ví dụ về câu lệnh CASE đơn giản

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
8

Như với lệnh

IF expression THEN
    statements
END IF;
4, bạn có thể chỉ định nhiều câu lệnh
    IF sale_value > 200
    THEN
        CALL apply_free_shipping(sale_id);
    END IF;
2 và bạn có thể chỉ định mệnh đề
IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
0 sẽ thực thi nếu không có điều kiện nào khác áp dụng

Tuy nhiên, điều quan trọng là phải nhận ra rằng một tuyên bố

IF expression THEN
    statements
END IF;
5 sẽ đưa ra một ngoại lệ nếu không có điều kiện nào được áp dụng. Điều này có nghĩa là nếu
    IF sale_value > 200
    THEN
        CALL apply_free_shipping(sale_id);
    END IF;
5 không phải là một trong số '
    IF sale_value > 200
    THEN
        CALL apply_free_shipping(sale_id);
    END IF;
6', '
    IF sale_value > 200
    THEN
        CALL apply_free_shipping(sale_id);
    END IF;
7', '
    IF sale_value > 200
    THEN
        CALL apply_free_shipping(sale_id);
    END IF;
8' hoặc '
    IF sale_value > 200
    THEN
        CALL apply_free_shipping(sale_id);
    END IF;
9' thì ngoại lệ thời gian chạy sau đây sẽ xảy ra

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
9

Chúng ta có thể tạo một trình xử lý ngoại lệ để bỏ qua lỗi này (như được mô tả trong Chương 6), nhưng có lẽ cách tốt hơn là viết mã một mệnh đề

IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
0 để đảm bảo rằng tất cả các điều kiện có thể được xử lý. Vì vậy, có lẽ chúng ta nên điều chỉnh ví dụ trước để bao gồm một mệnh đề
IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
0 áp dụng chiết khấu bằng 0 cho khách hàng không đáp ứng các điều kiện trên

Mẹo

Nếu không có câu lệnh nào trong số

IF expression THEN
    statements
END IF;
5 phù hợp với điều kiện đầu vào, thì
IF expression THEN
    statements
END IF;
5 sẽ gây ra lỗi MySQL 1339. Bạn nên xây dựng một trình xử lý lỗi để bỏ qua lỗi này hoặc đảm bảo rằng ngoại lệ không bao giờ xảy ra bằng cách bao gồm mệnh đề
IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
0 trong câu lệnh
IF expression THEN
    statements
END IF;
5 của bạn

Câu lệnh

IF expression THEN
    statements
END IF;
5 đơn giản rất hữu ích khi so sánh giá trị của một biểu thức với một loạt các giá trị cụ thể. Tuy nhiên, câu lệnh
IF expression THEN
    statements
END IF;
5 đơn giản không thể khớp các phạm vi một cách dễ dàng hoặc tự nhiên hoặc xử lý các điều kiện phức tạp hơn liên quan đến nhiều biểu thức. Đối với những “trường hợp” phức tạp hơn này, chúng ta có thể sử dụng câu lệnh “đã tìm kiếm”
IF expression THEN
    statements
END IF;
5, được mô tả trong phần tiếp theo

Câu lệnh CASE “Đã tìm kiếm”

Câu lệnh

IF expression THEN
    statements
END IF;
5 được tìm kiếm có chức năng tương đương với một khối
   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
10. Câu lệnh
IF expression THEN
    statements
END IF;
5 được tìm kiếm có cú pháp như sau

IF expression THEN
    statements
END IF;
0

Sử dụng cấu trúc

IF expression THEN
    statements
END IF;
5 đã tìm kiếm, chúng tôi có thể triển khai logic giảm giá và miễn phí vận chuyển mà chúng tôi đã triển khai trước đó bằng cách sử dụng
IF expression THEN
    statements
END IF;
4. Bản dịch trực tiếp logic giảm giá bán hàng và giao hàng miễn phí của chúng tôi bằng cách sử dụng câu lệnh
IF expression THEN
    statements
END IF;
5 đã tìm kiếm được hiển thị trong

Ví dụ 4-16. Ví dụ về câu lệnh CASE đã tìm kiếm

IF expression THEN
    statements
END IF;
1

Tuy nhiên, hãy nhớ rằng nếu không có mệnh đề nào trong số các mệnh đề

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
15 khớp với nhau thì sẽ xảy ra lỗi 1339. Do đó, mã này sẽ gây ra lỗi nghiêm trọng nếu đơn đặt hàng dưới 200 đô la hoặc khách hàng không tham gia chương trình khách hàng thân thiết của chúng tôi—một kết quả không mấy vui vẻ. Vì vậy, chúng ta nên bảo vệ quy tắc của mình—và sự đảm bảo công việc của chúng ta—bằng cách bao gồm một điều khoản
IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
0 như trong

Ví dụ 4-17. Thêm mệnh đề ELSE giả vào ví dụ CASE đã tìm kiếm của chúng tôi

IF expression THEN
    statements
END IF;
2

Lưu ý rằng vì MySQL thiếu câu lệnh

   IF (INSTR(l_version_string,'alpha')>0) THEN
         SELECT 'Alpha release of MySQL';
    ELSEIF (INSTR(l_version_string,'beta')>0) THEN
         SELECT 'Beta release of MySQL';
    ELSE
         SELECT 'Production release of MySQL';
    END IF;
17 (không làm gì) trong ngôn ngữ chương trình được lưu trữ, nên chúng tôi phải thêm một câu lệnh giả—nhưng câu lệnh này có chi phí không đáng kể

Như với việc triển khai logic này của chúng tôi đối với

IF expression THEN
    statements
END IF;
4, chúng tôi cũng có thể sử dụng các câu lệnh
IF expression THEN
    statements
END IF;
5 lồng nhau để thực hiện cùng một logic với sự rõ ràng hơn nhiều. Trong chúng tôi kết hợp các câu lệnh
IF expression THEN
    statements
END IF;
5 đơn giản và được tìm kiếm, đồng thời bao gồm một trình xử lý “không tìm thấy” để tránh phải bao gồm các câu lệnh
IF sale_value > 200 THEN
    CALL apply_free_shipping(sale_id);
    CALL apply_discount(sale_id,10);
END IF;
0. Chúng tôi đặt toàn bộ nội dung trong một khối để trình xử lý của chúng tôi không vô tình ảnh hưởng đến các câu lệnh khác trong chương trình được lưu trữ

Ví dụ 4-18. Sử dụng các câu lệnh CASE lồng nhau và trình xử lý “không tìm thấy” trong phạm vi khối

IF expression THEN
    statements
END IF;
3

Chúng ta đã thấy rằng cả hai câu lệnh

IF expression THEN
    statements
END IF;
4 và
IF expression THEN
    statements
END IF;
5 đều có thể triển khai cùng một chức năng kiểm soát luồng. Vậy cái nào là tốt nhất? . Tuy nhiên, khi quyết định giữa
IF expression THEN
    statements
END IF;
5 và
IF expression THEN
    statements
END IF;
4, hãy cân nhắc những điều sau

  • Tính nhất quán trong phong cách có lẽ quan trọng hơn bất kỳ lợi thế nhỏ nào mà một trong hai cách tiếp cận có thể có trong một hoàn cảnh cụ thể. Do đó, chúng tôi khuyên bạn nên chọn giữa

    IF expression THEN
        statements
    END IF;
    5 và
    IF expression THEN
        statements
    END IF;
    4 một cách nhất quán và không chuyển đổi ngẫu nhiên giữa hai tùy thuộc vào tâm trạng, thời tiết hoặc tử vi của bạn

  • IF expression THEN
        statements
    END IF;
    5 dễ đọc hơn một chút khi bạn đang so sánh một biểu thức đơn lẻ với một loạt các giá trị riêng biệt (sử dụng câu lệnh
    IF expression THEN
        statements
    END IF;
    5 “đơn giản”)

  • IF expression THEN
        statements
    END IF;
    4 có lẽ là một cấu trúc quen thuộc và dễ hiểu hơn khi bạn đánh giá các phạm vi hoặc biểu thức phức tạp dựa trên nhiều biến

  • Nếu bạn chọn

    IF expression THEN
        statements
    END IF;
    5, bạn cần đảm bảo rằng ít nhất một trong các điều kiện của
    IF expression THEN
        statements
    END IF;
    5 được khớp hoặc xác định một trình xử lý lỗi để bắt lỗi sẽ xảy ra nếu không có điều kiện nào của
    IF expression THEN
        statements
    END IF;
    5 được thỏa mãn.
    IF expression THEN
        statements
    END IF;
    4 không có hạn chế như vậy

Hãy nhớ—dù bạn sử dụng cấu trúc nào—thì

  • Khi bất kỳ điều kiện nào trong cấu trúc

    IF expression THEN
        statements
    END IF;
    5 hoặc
    IF expression THEN
        statements
    END IF;
    4 được thỏa mãn, sẽ không có điều kiện nào nữa được đánh giá. Điều này có nghĩa là nếu các điều kiện của bạn trùng lặp theo bất kỳ cách nào, thì thứ tự đánh giá là rất quan trọng

  • Ngôn ngữ chương trình được lưu trữ trong MySQL sử dụng logic ba giá trị;

  • Bạn nên suy nghĩ cẩn thận về mức độ dễ đọc của các câu lệnh của mình—đôi khi một tập hợp các câu lệnh

    IF expression THEN
        statements
    END IF;
    4 hoặc
    IF expression THEN
        statements
    END IF;
    5 lồng vào nhau sẽ dễ đọc hơn và có thể hiệu quả hơn. Tuy nhiên, tốt hơn hết là tránh lồng vào nhau, đặc biệt nếu các câu lệnh trở nên lồng vào nhau sâu (chẳng hạn ba cấp trở lên)

    Làm thế nào để sử dụng nếu khác trong truy vấn MySQL?

    Câu lệnh IF-THEN-ELSE của MySQL . Câu điều kiện IF THEN; . true – câu lệnh giữa IF-THEN và ELSE sẽ được thực thi. If a specified condition is: true – statements between IF-THEN and ELSE will be executed.

    Làm cách nào để sử dụng điều kiện if other trong thủ tục được lưu trữ trong SQL Server 2008?

    Câu lệnh IF ELSE kiểm soát luồng thực thi trong SQL Server. Nó có thể được sử dụng trong thủ tục lưu trữ, hàm, trình kích hoạt, v.v. để thực thi các câu lệnh SQL dựa trên các điều kiện đã chỉ định . Biểu thức Boolean. Một biểu thức boolean trả về TRUE hoặc FALSE.

    Làm cách nào để trả về một giá trị từ một thủ tục được lưu trữ trong MySQL?

    Để trả về một giá trị từ thủ tục được lưu trữ, bạn cần phải sử dụng biến phiên cụ thể do người dùng xác định. Thêm biểu tượng @ trước tên biến .

    Làm cách nào để sử dụng if other trong SQL Server?

    Câu lệnh Transact-SQL theo sau từ khóa IF và điều kiện của nó được thực thi nếu điều kiện được thỏa mãn. biểu thức Boolean trả về TRUE. Từ khóa ELSE tùy chọn giới thiệu một câu lệnh Transact-SQL khác được thực thi khi điều kiện IF không được thỏa mãn. biểu thức Boolean trả về FALSE