[Transact-SQL] Working with NULLs

Online Learning 2020. 12. 9. 14:31

NULL은 빠진 값이나 알려지지 않은 값이다.

 

2 + NULL = NULL

'MyString' + NULL = NULL

 

NULL = NULL returns false

NULL IS NULL returns true

 

데이터베이스에서는 NULL을 어떻게 처리하는지가 중요하다.

 

 

NULL Functions

  • ISNULL(column/variable, value)
    • 컬럼/변수가 NULL이면 value를 리턴한다
  • NULLIF(column/variable, value)
    • 컬럼/변수가 value이면 NULL을 리턴한다
  • COALESCE(column/variable1, column/variable2, ...)
    • 맨 처음 만나는 NULL이 아닌 컬럼/변수를 리턴한다.

 

 

Size를 정수로 TRY_CAST로 변환하고, 성공하면 그 값으로, 실패하면 NULL을 ISNULL함수를 통해 0 으로 바꾼다.

SELECT Name, ISNULL(TRY_CAST(Size AS Integer),0) AS NumericSize
FROM SalesLT.Product;

 

비슷하게 Color나 Size가 NULL이라면 '' (blank string)을 리턴한다.

SELECT ProductNumber, ISNULL(Color, '') + ', ' + ISNULL(Size, '') AS ProductDetails
FROM SalesLT.Product;

 

 

 

Color가 Multi이면 NULL을 리턴한다.

SELECT Name, NULLIF(Color, 'Multi') AS SingleColor
FROM SalesLT.Product;

 

 

 

 

DiscontinuedDate, SellEndDate, SellStartDate중 처음으로 NULL이 아닌 값을 리턴한다.

SELECT Name, COALESCE(DiscontinuedDate, SellEndDate, SellStartDate) AS FirstNonNullDate
FROM SalesLT.Product;

 

 

 

CASE는 프로그래밍 언어에서 if나 switch와 비슷하게 사용할 수 있다.

SellSellEndDate가 NULL이라면 SalesStatus 컬럼에 On Sale로 표시하고

                        NULL이 아니라면                   Discontinued로 표시한다.

--Searched case
SELECT Name,
		CASE
			WHEN SellEndDate IS NULL THEN 'On Sale'
			ELSE 'Discontinued'
		END AS SalesStatus
FROM SalesLT.Product;

WHEN THEN을 여러개 쓸 수 있다.

--Simple case
SELECT Name,
		CASE Size
			WHEN 'S' THEN 'Small'
			WHEN 'M' THEN 'Medium'
			WHEN 'L' THEN 'Large'
			WHEN 'XL' THEN 'Extra-Large'
			ELSE ISNULL(Size, 'n/a')
		END AS ProductSize
FROM SalesLT.Product;

: