제로베이스/코딩테스트

[프로그래머스 mysql oracle] NULL 처리하기 / null 관련 함수 정리

진주네카라 2022. 7. 15. 14:35
728x90

 

NULL 처리하기

 

문제 설명

코딩테스트 연습 - NULL 처리하기 | 프로그래머스 스쿨

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


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

 

입출력 예

예를 들어 ANIMAL_INS 테이블이 다음과 같다면


마지막 줄의 개는 이름이 없기 때문에, 이 개의 이름은 "No name"으로 표시합니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.


※ 컬럼 이름은 일치하지 않아도 됩니다.



입출력 예 설명

sql 작성시 name 값이 null인 경우 No name 으로 표시해야된다.

 


null 관련 함수 중에서

 

  1. case
  2. ifnull
  3. nvl
  4. decode

4가지로 작성해 보았다.





풀이코드


1. case

  • mysql & oracle
    • 형식
    • case
      • when 조건1 컬럼명 like '%키워드%' then '반환 값'
      • when 조건2 컬럼명 like '%키워드%' then '반환 값'
      • else 조건 제외한 '반환 값'
    • end as 별칭


sql

-- 코드를 입력하세요
SELECT A.ANIMAL_TYPE,
CASE 
    WHEN A.NAME IS NULL THEN 'No name'
    ELSE A.NAME
END AS NAME
, A.SEX_UPON_INTAKE
FROM ANIMAL_INS A
ORDER BY A.ANIMAL_ID;


실행 결과


잘못된 코드

-- 틀린 코드
SELECT A.ANIMAL_TYPE, A.NAME, A.SEX_UPON_INTAKE
FROM ANIMAL_INS A
CASE
WHEN A.NAME IS NULL THEN "No name"
ELSE A.NAME
END AS NAME
ORDER BY A.ANIMAL_ID;

 

case문을 where과 같이 조건문으로 사용하는 건줄 알았는데
잘못 알고 사용하고 있었다ㅠㅠ
그래서
case문은 select - from 사이에 위치해야 된다





2. ifnull

  • mysql only
    • 형식
    • ifnull(컬럼명, 'null인 경우 반환값')


sql

-- mysql
-- 코드를 입력하세요
SELECT A.ANIMAL_TYPE
, IFNULL(A.NAME, 'No name')
, A.SEX_UPON_INTAKE
FROM ANIMAL_INS A
ORDER BY A.ANIMAL_ID;


실행 결과
같음



3. nvl

  • oracle only
    • 형식
    • nvl(컬럼명, 'null인 경우 반환값')


sql

-- oracle
-- 코드를 입력하세요
SELECT A.ANIMAL_TYPE
, NVL(A.NAME, 'No name')
, A.SEX_UPON_INTAKE
FROM ANIMAL_INS A
ORDER BY A.ANIMAL_ID;


실행 결과
같음




4. decode

  • oracle only
    • 형식
    • decode(컬럼명, 조건1, 결과1, 조건2, 결과2, ... , 기본값)


sql

-- 코드를 입력하세요
SELECT A.ANIMAL_TYPE
, DECODE(A.NAME, NULL, 'No name', A.NAME)
, A.SEX_UPON_INTAKE
FROM ANIMAL_INS A
ORDER BY A.ANIMAL_ID;


실행 결과
같음






널 다지기시간
정리해 보니 case가 젤 비효율적이다..한줄이면 되는데!









728x90