MSSQL NULL과 공백문자 또는 0의 주의점

MSSQL를 사용하면서 자주 발생하는 버그 중 하나가 NULL공백문자에서 발생하게 됩니다.

또는 숫자 0에서도 발생하는 경우도 있습니다.

MSSQL에서는 오라클과 다르게 NULL공백문자를 따로 취급하기 때문입니다.

오라클에서는 값을 입력하기 않거나 공백문자인 만을 입력했을 경우 NULL로 인식합니다.

하지만 MSSQL에서는 값을 입력하지 않을 경우에는 NULL, 공백문자인 입력한 경우에는 NULL이 아닌 ”로 등록됩니다.

이렇게 NULL공백문자인 ”를 따로 취급하기 때문에 SELECT로 데이터를 취득한 후 로직에서 데이터가 존재하는지 판전을 할 때에 제대로 판정을 못하는 경우가 있습니다.

숫자 0도 같습니다.

MSSQL에서는 숫자형 컬럼에서도 NULL과 0을 따로 취급합니다.

먼저 NULL과 0의 판별을 보도록 하겠습니다.

 

NULL과 0 판별

DECLARE @table table (
	ID int,             -- ID
	ITEM_NO varchar(4), -- 상품번호
	QTY int             -- 재고
)

INSERT INTO @table VALUES (1,'0001',null)
INSERT INTO @table VALUES (2,'0002',0)
INSERT INTO @table VALUES (3,'0003',45)

SELECT
	ID,
	ITEM_NO,
	QTY,
	CASE WHEN ISNULL(QTY,0) = 0
		THEN '0또는 NULL'
		ELSE '0또는 NULL 이외'
	END AS RST
FROM
	@table

 

ISNULL 함수를 사용하여 재고의 값이 NULL인 경우 0으로 변환을 시킵니다.

이렇게 변환을 해주는 것으로 NULL과 0을 같은 값으로 판정하게 됩니다.

그 후에는 로직에 맞춰 THEN 에서 0또는 NULL로 설정해주면 됩니다.

0또는 NULL이외의 값일 경우, 컬럼의 값을 취득하려면 ELSE에 컬럼명을 설정해주면 됩니다.

다음은 NULL과 공백 문자 판별에 대해 보겠습니다.

 

NULL과 공백 문자 판별

DECLARE @table table (
	ID int, 	    -- ID
	ITEM_NO varchar(4), -- 상품 번호
	RESULT varchar(2)   -- 검색 결과
)

INSERT INTO @table VALUES (1,'0001',null)
INSERT INTO @table VALUES (2,'0002','')
INSERT INTO @table VALUES (3,'0003','OK')
INSERT INTO @table VALUES (4,'0004','NG')

SELECT
	ID,
	ITEM_NO,
	RESULT,
	CASE WHEN ISNULL(RESULT,'') = ''
		THEN '공백문자 또는 NULL'
		ELSE '공백문자 또는 NULL 이외'
	END AS RST
FROM
	@table

 

NULL과 공백 문자 판별에서도 ISNULL 함수를 사용합니다.

ISNULL로 검색 결과 컬럼인 RESULT의 값이 NULL인 경우 공백 문자인 ”로 변화시킵니다.

이것으로 NULL과 공백 문자인 ”을 같은 값으로 판정하여 사용할 수 있습니다.

그 후 로직에 맞춰 THEN 에서 또는 NULL로 설정해주면 됩니다.

공백문자 또는 NULL 이외의 값일 경우, 컬럼의 값을 취득하려면 ELSE에 컬럼명을 설정해주면 됩니다. 

 

 

WHERE 조건

검색 조건에서도 위와 동일하게 사용할 수 있습니다.

DECLARE @table table (
	ID int,				-- ID
	ITEM_NO varchar(4),	-- 상품 번호
	RESULT varchar(2)	-- 검색 결과
)

INSERT INTO @table VALUES (1,'0001',null)
INSERT INTO @table VALUES (2,'0002','')
INSERT INTO @table VALUES (3,'0003','OK')
INSERT INTO @table VALUES (4,'0004','NG')

SELECT
	ID,
	ITEM_NO,
	RESULT,
	CASE WHEN ISNULL(RESULT,'') = ''
		THEN '공백문자 또는 NULL'
	ELSE '공백문자 또는 NULL 이외'
	END AS RST
FROM
	@table
WHERE
	ISNULL(RESULT,'') != ''

 

검색 조건 WHERE 에서 검색 대상의 컬럼에 ISNULL을 사용하여 NULL 값을 로 변경하여 검색을 합니다.

위의 변환으로 NULL공백 문자 ”로 인식되어 검색은 NULL공백문자 ”를 제외한 모든 값이 검색 됩니다.

한가지 주의 점으로 테이블의 검색 대상 컬럼에 ISNULL을 이용하여 변환을 하고 있기 때문에 데이터가 많은 테이블의 경우 성능에 문제가 발생하는 경우도 있을 수 있습니다.

테이블에 존재하는 모든 행을 검색하여 ISNULL을 실행 후 검색을 진행하기 때문입니다.

이러한 경우에는 ISNULL 보다는 아래와 같이 사용하는 것을 추천합니다.

WHERE RESULT != '' AND RESULT IS NOT NULL

 

이것으로 MSSQL에서의 NULL공백문자, 숫자 0의 값의 대해 알아봤습니다. 

댓글