테이블의 NULL 허용 필드에 데이터를 넣을 때 빈 문자열(empty string)을 넣으면 어떻게 될까요? 아래의 두가지 쿼리가 어떻게 동작할지를 말하는 것입니다.
INSERT INTO tb_test (id, name) VALUES (1, NULL); INERRT INTO tb_test (id, name) VALUES (2, '');
1. Oracle
오라클에서는 NULL과 빈문자열 '' 이 모두 NULL 로 처리 됩니다. 위에서 id 가 1, 2 인 행의 name은 모두 NULL 이 들어갑니다.
SELECT * FROM tb_test WHERE name IS NULL;
위와 같이 쿼리하면 id가 1, 2인 행이 모두 조회됩니다. 데이터베이스에서 NULL은 등호(=)로 비교할 수 없습니다. 반드시 IS NULL 또는 IS NOT NULL 을 사용해서 판별하여야 합니다.
값이 NULL인 문자열의 길이는 얼마가 나올까요?
SELECT LENGTH(name) FROM tb_test WHERE name IS NULL;
답은 NULL 입니다. 데이터베이스에서 NULL을 다룰 때는 항상 주의해야 합니다. 계산에 NULL 이 사용 되면 0처럼 동작하는것이 아니라 결과가 NULL이 되어 버립니다.
2. MySQL(MariaDB)와 SQLServer
MySQL(MariaDB)와 마이크로소프트의 SQLServer에서는 빈 문자열이 입력됩니다.
SELECT * FROM tb_test WHERE name = '';
위와 같이 조회 하면 id가 2인 행이 나옵니다.
SELECT * FROM tb_test WHERE name IS NULL;
이렇게 조회 하면 id가 1인 행이 나옵니다.
각각에서 빈 문자열 필드의 길이를 구해보면 0이 나오게 됩니다.
-- MySQL SELECT LEN(name) FROM tb_test WHERE name = ''; -- SQLServer SELECT LENGTH(name) FROM tb_test WHERE name = '';
데이터베이스 NULL 을 잘 다루는 것은 매우 중요합니다. 데이터베이스에서 값을 조회한 프로그램에서 오류를 낼 수 도 있고, 계산등에서 값이 맞지 않을 수도 있기 때문입니다.
출처: https://offbyone.tistory.com/226 [쉬고 싶은 개발자]
mysql에서 공백과 null 동시 체크
여러가지 방법이 있겠으나 제가 선호 하는 방식에 대한 설명입니다.
NULLIF(컬럼명,'') IS NULL
NULLIF를 이용하여 해당 컬럼명이 '' 공백과 같다면 null 치환하여 해당 컬럼이 null인지 여부를 체크하는 방식입니다.
관련 참고 함수
1. CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...] [ELSE result] END
switch 문과 유사항 방식
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
switch 문 - IF문 의 조합형
2. IF(expr1, expr2, expr3)
: expr1이 TRUE 이면 expr2를 리턴하고, 그렇지 않은 경우 expr3를 리턴한다.
3. IFNULL(expr1, expr2)
: expr1이 NULL이면 expr2를 리턴하고, NULL이 아니면 expr1을 리턴한다.
4. NULLIF(expr1, expr2)
: expr1 = expr2가 TRUE이면 NULL을 리턴하고, 그렇지 않으면 expr1을 리턴한다.
이것은 CASE WHEN expr1=expr2 THEN NULL ELSE expr1 END 와 같다.
'DATABASE(SQL)' 카테고리의 다른 글
mysql - 프로시저 (0) | 2020.06.24 |
---|---|
전자정부 프레임워크에 트랜잭션 적용하기 (2) | 2020.03.31 |
Maria DB (1) | 2020.03.23 |
이력 테이블에서 최종 데이터만 조회하기 (0) | 2020.03.03 |
DB모델링 - Entity, Attribute, Identifier, Relation (0) | 2020.01.03 |