본문 바로가기

SQL

[SQL 독학하기] 프로그래머스 오답풀이 - Null 처리하기

Intro

지난달 들었던 SQL 강의는 Oracle 기반 SQL이었다.

프로그래머스 문제를 풀기 전까지만 해도 MySQL과 Oracle에서 서로 다른 문법이 사용된다는 것도 몰랐다(창피하지만 사실이고, 사실이지만 창피하다).. 이런 면에서 프로그래머스는 MySQL과 Oracle 결과를 동시에 볼 수 있다는 게 큰 장점인 것 같다.

이 문제에서 가장 헷갈렸던 부분은 MySQL과 Oracle에서 Null값을 처리할 때 사용하는 함수의 차이, Single / Double quatation mark의 활용 차이다.

해당 문제 및 나의 답안, 해결방안은 아래와 같다.

 

Question

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAME  TYPE  NULLABLE
ANIMAL_ID VARCHAR(N) FALSE
ANIMAL_TYPE VARCHAR(N)  FALSE
DATETIME  DATETIME FALSE
INTAKE_CONDITION VARCHAR(N) FALSE
NAME  VARCHAR(N) TRUE
SEX_UPON_INTAKE VARCHAR(N) FALSE

입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 "No name"으로 표시해 주세요.

 

Answer

Oracle에서 작성한 나의 답안은 아래와 같다.

--Oracle--
SELECT ANIMAL_TYPE, NVL(NAME,'No name') AS NAME, SEX_UPON_INTAKE
  FROM ANIMAL_INS;

Null값을 다른 값으로 치환하기 위해 NVL함수를 사용했다.

 

그러나 MySQL에서 동일한 NVL 함수를 실행했더니 아래와 같은 오류가 발생하였다.

또 안된대..

 

따라서 Oracle과 MySQL에서 Null값을 처리하는 함수 간 차이를 공부했다.

 

Solutions

[Oracle에서 Null값 처리하기]

Oracle에서 Null값을 처리하는 방법은 2가지 정도가 있다.

1) NVL, NVL2

NVL 함수는 Null 값이면 지정값을, Null 값이 아니면 기본값을 출력한다.

▶ NVL(문자열, Null 값일 때 지정값)

NVL2 함수는 Null값일 때 지정값과 Null값이 아닐 때 지정값을 설정할 수 있다.

▶ NVL2(문자열, Null 값이 아닐 때 지정값, Null값일 때 지정값)

 

2) DECODE

DECODE 함수는 IF문을 간단하게 구현하기 좋은 함수이다.

▶ DECODE(문자열, 조건1, 결과1, 조건2, 결과2,..., 조건 외 결과)

예를 들어, 부서번호가 10번일 때는 100, 부서번호가 20번일 때는 20, 그 외 부서번호는 0을 출력할 때 IF문을 활용한 쿼리문과 DECODE 함수를 활용한 쿼리문을 비교하면 아래와 같다.

- IF 부서번호 = 10 THEN 100 ELSE IF 부서번호 = 20 THEN 200 ELSE 0

- DECODE(부서번호, 10, 100, 20, 200, 0)

 

[MySQL에서 Null값 처리하기]

MySQL에서 Null값을 처리하는 방법으로는 IFNULL 함수를 들 수 있다.

IFNULL함수는 Null값일 때 지정값을 출력할 수 있고, Oracle의 NVL 함수와 비슷하다.

▶ IFNULL(문자열, Null 값일 때 지정값)

 

IFNULL 함수를 활용해 위 문제의 답안을 작성한 쿼리문은 아래와 같다.

--MySQL--
SELECT ANIMAL_TYPE, IFNULL(NAME,'No name') NAME, SEX_UPON_INTAKE
  FROM ANIMAL_INS;

 

[전체 DBMS에서 활용할 수 있는 방법]

1) CASE

CASE문은 DECODE와 같이 IF문을 구현하는 방법 중 하나이다.

CASE문이 Oracle의 DECODE와 다른 점은 DECODE는 등호(=) 비교만 가능한 반면, CASE는 등호와 부등호(>,>=,<,<=) 비교가 모두 가능하다는 것이다.

▶ CASE WHEN 조건 1 THEN 결과 1 WHEN 조건 2 THEN 결과 2 ... ELSE 조건 외 결과 END

 

2) COALESCE

COALESCE 함수는 Oracle의 NVL함수 및 MySQL의 IFNULL 함수와 유사하게 활용할 수 있다.

▶ COALESCE(문자열, Null 값일 때 지정값)

 

이외에 여러 개의 컬럼에서 Null값이 아닌 값을 반환해야 할 때도 사용할 수 있다.

▶ COALESCE(컬럼1, 컬럼2, 컬럼3,...)

이렇게 활용하면, n개의 컬럼에서 Nul값이 아닌 데이터 중 맨 첫번째 데이터만 출력하게 된다.

예를 들어 COALESCE(Null, 'a', 'b')를 실행하면 a가 출력되고, COALESCE('c', Null, 'd')을 실행하면 c가 출력되는 원리이다.

위 예시에 문자가 아닌 데이터셋의 컬럼을 넣으면 여러 컬럼 중 Null값이 아닌 값 중 가장 처음 나오는 데이터를 출력한다.

COALESCE 함수의 원리에 대해 잘 정리해 놓으신 분의 게시글을 같이 첨부해본다 :)

https://gent.tistory.com/479

 

[Oracle] COALESCE 함수 사용법 (NVL 여러개)

오라클에서 NULL 값을 치환할 때는 NVL, NVL2, COALESCE 함수를 사용한다. COALESCE 함수는 NVL 함수의 기능이 조금 더 확장된 함수라고 생각하면 된다. NVL 함수와 동일하게 사용할 수도 있지만, 여러 개의

gent.tistory.com

 

3) IF문

IF문은 모든 조건문의 기본 형식으로, 두 DBMS에서 모두 활용할 수 있다.

▶ IF 조건 1 THEN 결과 1 ELSE IF 조건 2 THEN 결과 2 ... ELSE 조건 외 결과 END

 

 

PS) 위 내용에 틀린 부분이나 추가할 수 있는 내용이 있다면 꼭 댓글로 남겨주세요!!