본문 바로가기
프로그래밍/SQL, Hive, SAS 관련 정보

[SQL - Frequently Used Code] In-절에서 NULL

by 물박사의 저장공간 2025. 1. 18.

2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents


In/혹은 Not in으로 특정 집합의 값 중의 하나인지 검사하는 경우가 종종 있습니다. 그런데 여기에 NULL이 포함된 경우에 에러가 발생할 수 있습니다. 이 부분을 주의해야 합니다. 

 

예를 들어, 아래의 문제에서

https://www.hackerrank.com/challenges/binary-search-tree-1/problem?isFullScreen=true

 

Binary Tree Nodes | HackerRank

Write a query to find the node type of BST ordered by the value of the node.

www.hackerrank.com

P 칼럼에는 NULL값이 존재합니다. 그래서 아래처럼 쿼리를 사용할 경우에 오류가 발생합니다. 

select case when P is NULL then 'Root'
            when N not in (select distinct(P) from BST) then 'Leaf'
            else 'Inner' end AS TYPE
from BST
order by N;

 

In 함수 대신에 작동방식이 조금 다르지만 유사한 Exists를 사용할 수도 있지만 간단하게 조건만 하나 더 달아서 NULL이 아닌 경우만 따져주면 해결됩니다. 

select N, case when P is NULL then 'Root'
            when N not in (select distinct(P) from BST where P is not NULL) then 'Leaf'
            else 'Inner' end AS TYPE
from BST
order by N;

 

 

추가로 다른 관점에서 MySQL 쿼리 정답도 첨부합니다(일단 부모와 자손의 정보를 가진 테이블을 생성해서 node별로 group별 집계한 후 라벨을 붙이는 방식). 

select node, case when pare_node=0 then 'Root' 
                  when ds_node=0 then 'Leaf'
                  else 'Inner' end node_type
from 
    (select c.N node, count(c.P) pare_node, count(d.P) ds_node
    from BST c
    left join BST d on c.N=d.P 
    group by c.N) tp order by node;

 


In관련 자세한 내용은 아래 블로그를 참고하시면 좋을 것 같습니다. 

https://velog.io/@park2348190/SQL-IN-%EC%BF%BC%EB%A6%AC%EC%97%90%EC%84%9C-Null-%EA%B0%92%EC%9D%98-%EC%98%81%ED%96%A5

 

SQL 'IN' 쿼리에서 Null 값의 영향

업무 중 SQL 쿼리를 작성하다가 쿼리 결과가 예상한 것과 다른 경우가 있었다. 확인해보니 WHERE 절 안의 IN, NOT IN 쿼리에서 비교 대상이 null 인 경우가 문제였는데 관련해서 검색해보니 이 주제를

velog.io

 

참고) In 을 사용할 때 꼭 칼럼에 어떤 값이 들어있는 것만 체크해야하는 것은 아닙니다. 거꾸로 '문자열' in ColumnA 와 같은 형식으로 사용하는 것도 가능합니다. 

'프로그래밍 > SQL, Hive, SAS 관련 정보' 카테고리의 다른 글

[SQL 기초] CASE WHEN  (1) 2025.01.19
[SQL 기초] KEEP함수 (Oracle)  (0) 2025.01.19
[SQL 기초] Greatest/Least  (0) 2025.01.18
[SQL 기초] SUBSTR함수  (0) 2025.01.18
[SQL 기초] ROWNUM(혹은 LIMIT)  (2) 2025.01.18