0
0
Lập trình
Admin Team
Admin Teamtechmely

Hàm IIF trong SQLite: Chức năng Scalar với 3 giá trị

Đăng vào 1 tuần trước

• 5 phút đọc

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 iifif 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 Copy
SELECT iif(1=0, 'one is zero', 'one is not zero');

Kết quả sẽ trả về:

Copy
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 Copy
SELECT iif(7%2=0, 'even', iif(7%3=0, 'multiple of 3', 'prime')) AS is_prime;

Kết quả trả về:

Copy
+---------+
| 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 Copy
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ề:

Copy
+--------------+
| 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 Copy
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ề:

Copy
+--------------+
| 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 Copy
SELECT iif(2025%4=0, 'probably leap', 'not leap') AS is_leap_year;

Kết quả trả về:

Copy
+--------------+
| is_leap_year |
+--------------+
| not leap     |
+--------------+

Biểu thức 2 giá trị

sql Copy
SELECT iif(2025%4=0, 'probably leap') AS is_leap_year;

Kết quả trả về:

Copy
+--------------+
| 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 Copy
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ề:

Copy
+---------------+
| 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ả iifif đề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

  1. 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.
  2. 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.
  3. 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.
Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào