ABOUT ME

Today
Yesterday
Total
  • [데이터베이스] SQL 에서 NULL 다루기
    데이터베이스와 SQL 2022. 10. 4. 17:11

    NULL 함수 

    어떤 프로그래밍 언어를 배우던지 NULL 값을 이해하고 다루는 것은 중요하다. 

    NULL은 0과 다른 상수이다. 쉽게 말해 unknown value 라고 할 수도 있다.

    NULL 값과 어떤 수와 어떤 연산을 해도 그 값은 NULL이 된다.

    NULL은 일반적인 비교 연산자를 사용할 수 없다. unknown 값을 비교하는 것이 무의미 한 것과 마찬가지로..  

    또한 NULL 값은 가장 작은 값으로 취급된다. 오름차순 정렬을 할 때 가장 먼저 NULL값이 온다.

     

    NULL과 관련된 함수로 다음과 같은 것들이 있다. 

    • ISNULL (), IS NOT NULL(): null 인지 아닌 지를 판단
    • COALESCE(): NULL 이 아닌 첫 번째 값을 반환 (중첩 CASE 문에 해당)
    • NULLIF( ): 동일한 값이면 NULL, 아니면 첫 번째 값 반환

    활용 예: Exclusive OR 관계, 여집합 구하기, 0으로 나눌 때 오류 처리

     

    NULL 을 IN(), NOT IN() 에서는 다음과 같은 특징을 주의 해야 한다. 

    NOT IN 의 경우 and 로 unknown을 결합하게 되면 전체가 unknown이 된다.

    SELECT *
    FROM suppliers
    WHERE region IN ('CA', 'LA', NULL);
    
    --IN 구문을 풀어서 쓰면 다음과 같음
    SELECT *
    FROM suppliers
    WHERE region = 'CA' OR region = 'LA' OR region = NULL;  -- null은 무시됨
    
    -- NOT IN 의 경우? 전체가 UNKNOWN이 됨
    SELECT *
    FROM suppliers
    WHERE region NOT IN ('CA', 'LA', NULL);
    
    SELECT *
    FROM suppliers
    WHERE region <> 'CA' AND region <> 'LA' AND region <> NULL; -- OR 가 AND 가 되므로 값이 나오지 않음
    
    
    SELECT * 
    FROM dbo.[ ] 
    WHERE Region NOT IN (SELECT ... ) -- 서브쿼리에서 null 값 리턴되지 않아야 함

     

     

    NULLIF 로 여집합 구하기

    SELECT 
    	COUNT(*),
    	COUNT(CASE WHEN EmployeeID <> 999 THEN 1 END) -- 사원번호 999가 아닌 값들만 count가 됨
    FROM orders
    
    
    SELECT
    	COUNT(*),
    	COUNT(NULLIF(Employee, 999)) -- 사원번호가 999번인 경우 null로 리턴
    FROM orders

    [참고]

    SQL Server 컨설턴트가 알려주는, 쿼리 능력 레벨업(고급 T-SQL 쿼리) 강의

    SQL 전문가 가이드

    반응형

    댓글

Designed by Tistory.