Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Xử lý NULL trong SQL Server

NULL là gì? NULL hoặc điểm đánh dấu NULL là cách chúng tôi đại diện cho một giá trị không xác định trong SQL, bằng SQL, tôi đang đề cập đến Ngôn ngữ truy vấn có cấu trúc tiêu chuẩn, không phải MS SQL Server. Câu cuối cùng đưa chúng ta trở lại năm 1969 khi tiêu chuẩn lần đầu tiên được xác định bởi Tiến sĩ E.F. Codd. NULL trở nên cần thiết bởi vì chúng ta cần suy nghĩ về thứ được gọi là logic vị từ ba giá trị. Vị từ là thuộc tính của một biểu thức giữ hoặc không giữ. Theo mệnh giá, người ta sẽ nghĩ đến hai khả năng:ĐÚNG hoặc SAI. Tuy nhiên, có một khả năng thứ ba:KHÔNG BIẾT.

Hãy lấy một ví dụ. Giả sử một thuộc tính (cột) trong mối quan hệ của chúng tôi (Bảng) đại diện cho Mã số nhận dạng thuế (TIN) của một nhóm chủ sở hữu Doanh nghiệp nhỏ ở Accra, Ghana. Cột cho hồ sơ của mỗi chủ sở hữu doanh nghiệp sẽ được điền bằng TIN của họ và chúng tôi có thể sử dụng cột này để xác định một số thuộc tính khác, chẳng hạn như liệu họ có cập nhật trong Thanh toán thuế hay không. Tuy nhiên, có hai khả năng bổ sung trong trường hợp sử dụng này:

  1. Chủ Doanh nghiệp có TIN và được cập nhật.
  2. Chủ sở hữu doanh nghiệp không có TIN và (rõ ràng) không được cập nhật.

Phần trên mô tả cái mà Tiến sĩ Codd gọi là logic vị từ bốn giá trị. Tuy nhiên, tiêu chuẩn SQL đơn giản hóa hai điều kiện bổ sung này bằng cách định nghĩa nó là không xác định, tức là NULL. Chúng tôi không biết TIN của chủ sở hữu doanh nghiệp và không thể xác định bất kỳ giá trị nào khác từ thuộc tính của Chủ doanh nghiệp bị ảnh hưởng. Vì vậy, NULL là UNKNOWN và là giá trị thứ ba trong logic vị từ ba giá trị tiêu chuẩn.

NULL là đặc biệt

Định nghĩa của NULL yêu cầu việc xử lý điểm đánh dấu theo một cách khác với các giá trị thực tế. Sau đây là các ví dụ:

  1. Không có cái gọi là bộ lọc “WHERE =NULL;”. Biểu thức đúng sẽ là "WHERE IS NULL;". Tương tự với biểu thức converse.
  2. Khi sắp xếp SQL theo thứ tự tăng dần, bạn có thể chọn liệt kê các NULL đầu tiên hoặc cuối cùng. Mặc định là liệt kê các NULL trước.
  3. Bạn không thể so sánh các giá trị NULL. Điều này phải rõ ràng vì chúng tôi đã nói rằng NULL là KHÔNG CÓ.
  4. Khi cố gắng ghép liên quan đến cột NULL, kết quả là NULL.

Các hàm phổ biến liên quan đến NULL

Sau đây là ba hàm liên quan đến NULL phổ biến trong SQL Server

ISNULL

ISNULL - Thay thế NULL bằng một giá trị thay thế được chỉ định. Liệt kê 1 và Hình 1 cho thấy các ví dụ đơn giản về ISNULL.

-- Listing 1: Simple Example of ISSNULL
SELECT ISNULL (NULL, 3) NULLREPLACEMENT;
SELECT ISNULL (NULL,'GREEN') NULLREPLACEMENT;
SELECT ISNULL (NULL,'2018-12-25') NULLREPLACEMENT;

Hình 1:Ví dụ đơn giản về ISNULL

NULLIF

NULLIF trả về NULL là giá trị của hai đối số bằng nhau.

-- Listing 2: Simple Example of NULLIF
SELECT NULLIF(3,3) AS NULLIFF;
SELECT NULLIF(3,5) AS NULLIFF;
SELECT NULLIF('RED','RED') AS NULLIFF;
SELECT NULLIF('GREEN','RED') AS NULLIFF;

Hình 2:Ví dụ đơn giản về NULLIF

COALESCE

COALESCE trả về giá trị không phải NULL đầu tiên từ danh sách được cung cấp. Liệt kê 1 cho thấy các ví dụ về điều này và Hình 1 cho thấy đầu ra của các truy vấn.

-- Listing 3: Simple Example of COALESCE
SELECT COALESCE (NULL,'','GREEN','','') AS NULLRESPONSE;
SELECT COALESCE (NULL,'GREEN','HOPE','') AS NULLRESPONSE;
SELECT COALESCE (1,'','GREEN','','') AS NULLRESPONSE;

Hình 3:Ví dụ đơn giản về Coalesce

Lưu ý rằng những ví dụ đơn giản này cho thấy việc sử dụng bản chất của NULL. NULL và khoảng trắng KHÔNG giống nhau. Trong câu lệnh đầu tiên, COALESCE trả về một khoảng trống cho chúng ta thấy rằng một khoảng trống là giá trị không phải NULL đầu tiên trong danh sách.

Sự khác biệt giữa ISNULL và COALESCE

Sự khác biệt giữa ISNULL và COALESCE là chủ đề của một số bài báo trực tuyến cũng như sách như những bài báo được liệt kê trong phần tài liệu tham khảo. Những khác biệt này được tóm tắt như sau:

  1. ISNULL là độc quyền của SQL Server trong khi COALESCE là một hàm tiêu chuẩn ANSI. Điều này ngụ ý rằng vì tính di động, COALESCE được ưu tiên hơn.
  2. ISNULL chỉ có hai đối số trong khi COALESCE có thể có nhiều hơn hai đối số.
  3. Kiểu dữ liệu của giá trị do ISNULL trả về được xác định bởi kiểu dữ liệu của đối số đầu tiên trong khi kiểu dữ liệu của giá trị do COALESCE trả về được xác định bởi kiểu dữ liệu trong danh sách có mức độ ưu tiên cao nhất.
  4. Khi cả hai hàm được sử dụng với các truy vấn con, ISNULL hoạt động tốt hơn vì COALESCE được dịch nội bộ sang biểu thức CASE nên nó có xu hướng quét lặp lại.

Itzik Ben-Gan cũng khám phá các hàm ý khác của việc chuyển đổi COALESCE thành một biểu thức trường hợp trong bài viết của anh ấy, liên kết được cung cấp ở cuối bài viết này.

Các trường hợp sử dụng mẫu

Chúng tôi muốn hiển thị trên cổng thông tin điện tử danh sách khách hàng dựa trên các tiêu chí nhất định từ bảng mà chúng tôi đang tạo trong Liệt kê 4. Nhiệm vụ 1 và 2 đáp ứng các yêu cầu có thể có và chúng tôi sử dụng ISNULL và COALESCE để đáp ứng các yêu cầu.

--Listing 4: Table Creation Script
CREATE TABLE CUSTOMER 
(ID INT IDENTITY (1,1)
,FIRSTNAME VARCHAR(50)
,LASTNAME VARCHAR(50)
,SEX CHAR(1)
,ADDRESS VARCHAR(300)
,FIRSTTRANDATE DATETIME
,PHONENUMBER1 BIGINT
,PHONENUMBER2 BIGINT
,PHONENUMBER3 BIGINT);
GO

INSERT INTO CUSTOMER VALUES ('KENNETH','IGIRI','M','ACCRA, GHANA',GETDATE(),'0245335678','0555335678',NULL);
INSERT INTO CUSTOMER VALUES ('RICHARD','HANO','M','BUDAPEST, HUNGARY',GETDATE(),'889189400122',NULL,NULL);
INSERT INTO CUSTOMER VALUES ('GEORGINA','APPIAH','F','ACCRA, GHANA','09-16-2018','02456665678','0275339678',NULL);
INSERT INTO CUSTOMER VALUES ('HOWARD','KLEVIA',NULL,'HAGUE, SWITZERLAND','02-16-2017','3499285782',NULL,NULL);
INSERT INTO CUSTOMER VALUES ('ZEN','GREGOR',NULL,'SHANGHAI, CHINA','06-23-2018','0245335678','0555335678',NULL);
INSERT INTO CUSTOMER VALUES ('IHEOMA','AWA','F','LAGOS, NIGERIA',GETDATE(),'0245335678','0555335678',NULL);

Hình 4 Bảng mẫu

Nhiệm vụ 1 :Trả lại Danh sách tất cả những khách hàng không cung cấp số điện thoại thay thế.

--Listing 5: Table List of Customers with no Secondary Phones
--A: The Simple Answer
SELECT * FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ;

--B: Presenting the Result Set Better
SELECT 
FIRSTNAME
,LASTNAME
,ADDRESS
,FIRSTTRANDATE
,PHONENUMBER1 AS [PRIMARY PHONE NUMBER]
,ISNULL(CAST(PHONENUMBER2 AS VARCHAR), 'NO SECONDARY PHONE') AS [SECONDARY PHONE NUMBER]
FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ;

Sử dụng COALESCE (hoặc ISNULL), chúng tôi có thể trình bày thông tin cần thiết tốt hơn nhiều bằng cách sử dụng văn bản có nội dung "Không có điện thoại phụ".

Hình 5 Tập hợp kết quả cho Liệt kê 5

Nhiệm vụ 2 :Trả lại Danh sách tất cả khách hàng, Số điện thoại chính của họ, bất kỳ số điện thoại thay thế nào khác.

--Listing 6: Table List of Customers with an Other Alternate Number
SELECT 
FIRSTNAME
,LASTNAME
,ADDRESS
,FIRSTTRANDATE
,PHONENUMBER1 AS [PRIMARY PHONE NUMBER]
,COALESCE(CAST(PHONENUMBER2 AS VARCHAR),CAST(PHONENUMBER3 AS VARCHAR), 'NO OTHER PHONE') AS [OTHER PHONE NUMBER]
FROM CUSTOMER  ;

Hình 6 Tập hợp kết quả cho Liệt kê 6

Trong trường hợp này, ISNULL không phải là một tùy chọn vì chúng tôi đang chuyển ba đối số.

Kết luận

Trong bài viết này, chúng tôi đã thảo luận về khái niệm NULL vì nó liên quan đến logic vị từ ba giá trị và mô tả các chức năng phổ biến mà chúng tôi sử dụng trong SQL Server để xử lý các tập dữ liệu chứa NULL. Chúng tôi cũng đã xem các ví dụ về cách các hàm này có thể được sử dụng. Nhiều tài liệu tham khảo khác nghiên cứu sâu hơn về việc sử dụng, lợi ích và hạn chế của các chức năng này. Tôi thực sự giới thiệu các cuốn sách và blog của Itzik Ben-Gan như những nguồn thông tin tốt.

Tài liệu tham khảo

  • NULLIF (Giao dịch-SQL)
  • COALESCE (Giao dịch-SQL)
  • Bài viết của Itzik Ben-Gan

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn máy chủ SQL để lấy danh sách các cột trong bảng cùng với các ràng buộc Kiểu dữ liệu, KHÔNG ĐẦY ĐỦ và CHÍNH CHÍNH

  2. Lỗi SSMS 2016 khi nhập bacpac Azure SQL v12:không hỗ trợ khóa chính không có mật khẩu

  3. Khi nguyên tắc DRY không áp dụng:Các hoạt động BITWISE trong SQL Server

  4. Khung thực thể tải rất chậm lần đầu tiên sau mỗi lần biên dịch

  5. Nhật ký giao dịch SQL Server - Phần 1