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ụ Show
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ápCú 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ú
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-THENCâ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 Câu lệnh IF-THEN-ELSENế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. IF4 và IF5. Cả IF4 và IF5 đề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 IF4 thành câu lệnh IF5 hoặc ngược lại. Thông thường, việc lựa chọn giữa IF4 và IF5 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 IF4 và việc triển khai câu lệnh IF4 của MySQL không có gì ngạc nhiên. Cú pháp của IF4 trong các chương trình được lưu trữ là 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 IF4 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à
Kết hợp NẾU-THEN đơn giảnỞ dạng đơn giản nhất, IF4 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 IF4 này như sau IF hiển thị một câu lệnh IF4 đơ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 IF4, 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 IF4 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 IF4 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 IF4 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 IF4 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 IF4 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 IF4 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 IF4 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 IF4 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 IF4 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 IF4 đá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-ELSECú pháp đầy đủ của câu lệnh IF4 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 đề IF4 để đả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 IF4 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 IF4 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 IF4 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 IF5 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 IF5 đều có thể được thực hiện với câu lệnh IF4 (và ngược lại), nhưng câu lệnh IF5 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 IF5 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 IF5 đơ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 IF5 đơ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 IF4, 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ố IF5 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ẹoNếu không có câu lệnh nào trong số IF5 phù hợp với điều kiện đầu vào, thì IF5 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 IF5 của bạn Câu lệnh IF5 đơ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 IF5 đơ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” IF5, được mô tả trong phần tiếp theo Câu lệnh CASE “Đã tìm kiếm”Câu lệnh IF5 đượ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 IF5 được tìm kiếm có cú pháp như sau IF0 Sử dụng cấu trúc IF5 đã 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 IF4. 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 IF5 đã 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 IF1 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 IF2 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 IF4, chúng tôi cũng có thể sử dụng các câu lệnh IF5 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 IF5 đơ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 IF3 Chúng ta đã thấy rằng cả hai câu lệnh IF4 và IF5 đề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 IF5 và IF4, hãy cân nhắc những điều sau
Hãy nhớ—dù bạn sử dụng cấu trúc nào—thì
|