null trong SQL

Từ chuyện “Ăn gì cũng được” của chị em phụ nữ lại nghĩ về NULL trong SQL

Ngày đăng: 08/03/2022

“Ăn gì cũng được” và NULL trong SQL, khi nói về 2 thứ có vẻ chẳng liên quan nhưng lại giống nhau đến lạ. Không tin ư? Dưới góc nhìn của chàng trai DA độc thân của chúng ta thì có đấy. Cùng đọc phía dưới nhé. 

Khi tôi cố khớp lệnh với 7*7 49 các món ăn trong sổ tay phòng chống độc thân với trạng thái “Ăn gì cũng được” của crush, tất cả đều trả về FALSE. Trạng thái này làm chúng NULL, một khái niệm gây không ít phiền phức cho các bạn DA khi mới làm việc với SQL. 

NULL là gì?  

NULL là một giá trị đặc biệt có trong tất cả các loại dữ liệu, từ kiểu số, ngày, chuỗi, bit… Nó đại diện cho giá trị “không biết” hoặc “không tồn tại”. Khác với Excel, NULL trong SQL sẽ coi không trùng với số 0 của kiểu số và cũng không trùng với chuỗi trống (‘’) của kiểu chuỗi. Ví dụ bạn có bảng dữ liệu chứa các đối tượng tiềm năng trong công ty; có cột năm sinh. Nếu một bản ghi chứa NULL thì nghĩa là ta không biết đối tượng đó sinh năm nào chứ không phải đối tượng đó sinh năm 0. 

null trong sql

NULL nghĩa là không biết, nên mọi thao tác với NULL đều dẫn đến NULL. Đây là điều các bạn cần ghi nhớ để tránh phiền phức khi có những tính toán xử lý NULL trong SQL và xây dựng những test case liên quan. 

Vấn đề của NULL trong SQL

Nếu bạn cộng một số hoặc chuỗi với NULL, kết quả sẽ là NULL: 

Ví dụ: 

NULL trong SQL 1

 

Một tình huống thường gây rắc rối là khi các bạn cộng chuỗi từ các cột, ví dụ: 

 NULL trong SQL 2

 Sử dụng CONCAT 

concat với null

Sử dụngCONCAT_WS 

concat và null

Tình huống khác là là khi bạn tạo một câu SQL động và thực hiện nó, nhưng không hay biết là chuỗi SQL động đó là NULL vì một thành phần khi tạo lập nó là NULL: 

Null SQL

Ở ví dụ trên, vì biến @c là NULL nên @SQL cũng là NULL, cho nên không có kết quả nào trả về, và ta ngẩn người ra vì không nhận được kết quả cũng không nhận được báo lỗi. EXEC(NULL) luôn thành công vì nó không phải làm gì cả. 

Khi so sánh với NULL, ta cũng nhận được kết quả NULL thay vì giá trị boolean “Đúng” hoặc “Sai”.  

Vì thế khi truy vấn bảng mà trong mệnh đề WHERE có dùng cột chứa NULL, các bản ghi NULL luôn là ngoại lệ. Để lấy được các bản ghi này bạn cần dùng “IS NULL”. Còn để lấy được các bản ghi không NULL, bạn dùng “IS NOT NULL”. Ví dụ: 

so sánh với null

Để chuyển đổi NULL về một giá trị chỉ định, bạn dùng hàm ISNULL(). Ví dụ dưới đây nếu như năm sinh không xác định được sẽ coi là sinh năm 2000. 

isnull

Một ví dụ khác với trường hợp MiddleName 

Một trường hợp khác cũng cần lưu ý khi sử dụng NOT IN với dataset có NULL. 

Từ ý tưởng ISNULL, nếu coi trạng thái “Ăn gì cũng được” là một giá trị NULL, chúng ta có thể xử lý bằng cách đổi câu hỏi như sau:  

Nếu em chưa chọn được quán nào thì chúng mình ở nhà ăn Mì Tôm nhé. 

Câu hỏi này không đảm bảo luôn luôn thành công. Nhưng ít nhiều cũng sẽ thúc đẩy người phản hồi cần đưa ra 1 phương án thay thế nếu không trạng thái “Ăn gì cũng được” sẽ được điền luôn bằng “Mì Tôm”. (Kết quả áp dụng phát kiến này như thế nào? Bạn đọc đến cuối sẽ rõ.) 

Một vài lưu ý khác khi làm việc với NULL 

1. Khi dùng các hàm tính toán aggregate (như COUNT, SUM…), SQL loại bỏ các bản ghi NULL ra trước khi thực hiện do đó tránh được rắc rối khi dính với NULL 

2. COALESE vs ISNULL 

Một hàm khác thường dùng để xử lý NULL là COALESE. Trong hầu hết các trường hợp, COALESE và ISNULL có thể sử dụng thay thế được cho nhau, tuy nhiên, các bạn nên nắm rõ sự các biệt 2 hàm này để có thể sử dụng một cách phù hợp. 

COALESCE (param1, param2, param3… ): COALESE nhận vào nhiều giá trị và trả lại giá trị đầu tiên không NULL trong các giá trị được truyền vào. 

  ISNULL  COALESE 
Phạm vi  Có trên SQL Server, Sybase hoặc một vài phiên bản SQL khác  Hàm chuẩn của SQL theo ISO, có trên hầu hết các phiên bản SQL. 
Số giá trị nhận vào  2 giá trị  Nhiều giá trị 
Kiểu dữ liệu kết quả  Theo giá trị đầu tiên  Theo kiểu dữ liệu cao nhất trong datatype precedence. 

(mức độ chi tiết cao nhất trong các cột dữ liệu truyền vào). 

Để nhận rõ hơn sự khác biệt, hãy theo dõi ví dụ sau: 

coelse và null trong sql

Cá nhân mình thường ưu tiên dùng ISNULL do hàm này dễ dàng tính toán được kiểu dữ liệu trả ra, từ đó dễ dàng kiểm soát được câu lệnh. 

Mình áp dụng như chiến lược ở trên để xử lý NULL với lựa chọn của gấu, bị phạt ăn Mì Tôm 1 tuần. Bạn nào biết bí quyết làm lành với gấu chia sẻ mình nhé. Hứa sẽ chăm chỉ viết bài chia sẻ. 

 

P/s: Code mẫu viết trên SQL Server kiến thức chung đúng cho các bản SQL khác. 

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *