Hàm IIF trong SQLite: Chức năng Scalar với 3 giá trị
Trong phiên bản mới nhất của SQLite, cụ thể là phiên bản 3.48.0, hỗ trợ cho cặp điều kiện đã được thêm vào hàm iif
. Ngoài ra, một bí danh cho iif
là if
cũng được giới thiệu để tương thích và dễ sử dụng cho những người chuyển từ các cơ sở dữ liệu khác.
Tìm hiểu về hàm IIF trước phiên bản 3.48
Trước phiên bản này, hàm IIF
hoạt động tương tự như một phép toán ba ngả (ternary) với cú pháp như sau:
Cú pháp đơn giản IF THEN ELSE
Chúng ta có thể sử dụng hàm IIF
bằng cách truyền vào 3 tham số, tham số đầu tiên là điều kiện để kiểm tra, tham số thứ hai là giá trị trả về nếu điều kiện là đúng, và tham số thứ ba là giá trị trả về nếu điều kiện là sai.
sql
SELECT iif(1=0, 'one is zero', 'one is not zero');
Kết quả sẽ trả về:
one is not zero
IIF lồng nhau
Tham số thứ ba có thể được lồng với một hàm IIF
khác, vì nó sẽ là một giá trị cuối cùng. Chúng ta có thể sử dụng IIF
như sau:
sql
SELECT iif(7%2=0, 'even', iif(7%3=0, 'multiple of 3', 'prime')) AS is_prime;
Kết quả trả về:
+---------+
| is_prime|
+---------+
| prime |
+---------+
Mặc dù cú pháp này hoạt động, nhưng nó có thể trở nên khó đọc hơn khi kiểm tra nhiều điều kiện, ví dụ như:
sql
SELECT iif(2025 % 400 = 0, 'leap',
iif(2025 % 100 = 0, 'not leap',
iif(2025 % 4 = 0, 'leap', 'not leap'))) AS is_leap_year;
Kết quả trả về:
+--------------+
| is_leap_year |
+--------------+
| not leap |
+--------------+
Mặc dù cú pháp đã được cải thiện về mặt hình thức, nhưng vẫn có thể gây khó khăn khi viết và đọc do số lượng dấu đóng ngoặc.
Sự thay đổi sau phiên bản 3.48
Với phiên bản 3.48, cách sử dụng iif
hoặc if
đã thay đổi đáng kể. Bây giờ bạn có thể sử dụng chúng như một thay thế cho case when then
như sau:
sql
SELECT iif(2025 % 400 = 0, 'leap',
2025 % 100 = 0, 'not leap',
2025 % 4 = 0, 'leap', 'not leap') AS is_leap_year;
Kết quả trả về:
+--------------+
| is_leap_year |
+--------------+
| not leap |
+--------------+
Cú pháp mới này rất sạch sẽ, cho phép bạn xác định từng cặp điều kiện và giá trị, đồng thời vẫn duy trì tính tương thích ngược, đây là một điều đáng khen ngợi.
Các dạng biểu thức của hàm IIF
Bây giờ, hàm IIF
có 3 dạng:
- Biểu thức 3 giá trị (một biểu thức đơn giản, có thể lồng nhau nhưng chỉ bao gồm 3 biểu thức: điều kiện, giá trị đúng, giá trị sai)
- Biểu thức 2 giá trị (giả định giá trị sai là NULL)
- Biểu thức cặp N giá trị (nhiều cặp điều kiện và giá trị)
Biểu thức 3 giá trị
Đây là dạng đơn giản nhất:
sql
SELECT iif(2025%4=0, 'probably leap', 'not leap') AS is_leap_year;
Kết quả trả về:
+--------------+
| is_leap_year |
+--------------+
| not leap |
+--------------+
Biểu thức 2 giá trị
sql
SELECT iif(2025%4=0, 'probably leap') AS is_leap_year;
Kết quả trả về:
+--------------+
| is_leap_year |
+--------------+
| |
+--------------+
Kết quả là NULL vì 2025 không chia hết cho 4. Nếu có 2N tham số cho hàm và tất cả các điều kiện đều sai, nó sẽ trả về NULL.
Biểu thức cặp N giá trị
Cuối cùng là dạng dễ đọc nhất cho phép nhiều điều kiện:
sql
SELECT iif(2025 % 400 = 0, 'leap',
2025 % 100 = 0, 'not leap',
2025 % 4 = 0, 'leap',
'not leap')
|| ' year' AS is_leap_year;
Kết quả trả về:
+---------------+
| is_leap_year |
+---------------+
| not leap year |
+---------------+
Lưu ý rằng nếu không chỉ định điều kiện cuối cùng, nó sẽ trả về NULL. Tổng số tham số là 2N+1 (N là số điều kiện).
So sánh giữa IIF và CASE
Cả iif
và if
đều thực hiện cùng một chức năng như điều kiện CASE WHEN THEN
, nhưng cú pháp của iif
hiện nay dễ viết hơn rất nhiều nhờ vào việc hỗ trợ các tham số theo cặp.
Các thực tiễn tốt nhất khi sử dụng hàm IIF
- Giữ cho các điều kiện đơn giản: Không nên lồng quá nhiều điều kiện, điều này có thể làm cho mã của bạn khó đọc hơn.
- Kiểm tra kỹ các giá trị NULL: Đảm bảo rằng bạn đang xử lý các giá trị NULL đúng cách để tránh lỗi không mong muốn.
- Sử dụng bình luận: Bình luận rõ ràng trong mã của bạn để giải thích mục đích của từng điều kiện.
Những cạm bẫy thường gặp
- Lạm dụng lồng nhau: Tránh việc lồng nhiều hàm
IIF
vì chúng có thể làm mã khó hiểu và bảo trì. - Bỏ qua các giá trị NULL: Không xử lý giá trị NULL có thể dẫn đến các lỗi không mong muốn trong truy vấn của bạn.
Mẹo hiệu suất
- Tối ưu hóa điều kiện: Hãy chắc chắn rằng các điều kiện được tối ưu hóa để đạt được hiệu suất tốt nhất, đặc biệt khi làm việc với cơ sở dữ liệu lớn.
Giải quyết sự cố
Nếu bạn gặp phải vấn đề với cú pháp hoặc kết quả không như mong muốn, hãy kiểm tra từng điều kiện riêng lẻ để đảm bảo chúng hoạt động như dự kiến.
Kết luận
Hàm IIF
mới trong SQLite 3.48 cung cấp cho các lập trình viên một công cụ mạnh mẽ và linh hoạt hơn để xử lý các điều kiện trong truy vấn SQL. Với cú pháp đơn giản và khả năng tương thích ngược, IIF
là một lựa chọn tuyệt vời cho các lập trình viên hiện đại. Hãy thử nghiệm và khám phá thêm về khả năng của IIF
để tối ưu hóa mã SQL của bạn!
Câu hỏi thường gặp
-
Hàm IIF có khác gì so với hàm IF không?
- Cả hai hàm đều thực hiện chức năng tương tự, nhưng
IIF
hỗ trợ các cặp điều kiện và giá trị dễ hơn.
- Cả hai hàm đều thực hiện chức năng tương tự, nhưng
-
Tại sao tôi nên sử dụng hàm IIF?
- Hàm
IIF
giúp đơn giản hóa mã SQL của bạn và dễ dàng hơn trong việc xử lý các điều kiện phức tạp.
- Hàm
-
Làm thế nào để xử lý giá trị NULL trong hàm IIF?
- Hãy chắc chắn rằng bạn kiểm tra các điều kiện có thể dẫn đến giá trị NULL và xử lý chúng một cách thích hợp.