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관련 자세한 내용은 아래 블로그를 참고하시면 좋을 것 같습니다.
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 |