본문 바로가기
공부 기록

MYSQL에서의 조건문 (CASE- WHEN/ EXISTS/ IFNULL)

by 타태 2021. 10. 31.

 

2021.10.10 - [실전 공부/AWS&Docker&Linux] - [SERVER] 리눅스 + 도커 기반 서버 관리 시 정말 자주 사용하는 명령어 모음

 

[SERVER] 리눅스 + 도커 기반 서버 관리 시 정말 자주 사용하는 명령어 모음

2021.09.26 - [실전 공부] - [JAVA] Builder Pattern ( 빌더 패턴 )_사용 예제 ( Lombok + 일반) [JAVA] Builder Pattern ( 빌더 패턴 )_사용 예제 ( Lombok + 일반) 2021.08.01 - [실전 공부] - 모나코 에디터(..

ktae23.tistory.com

 

 

DB에서 원하는 값을 조회할 때 값 자체가 아니라 값이 있는지 여부를 확인해야 할 때가 있다.

이때 사용하는 구문은 IFNULL(조회 컬럼, NULL일 경우 반환값)을 넣어 조회한다.

 

예시 테이블

user_id user_name user_age phone
ktae23 타태 30 (NULL)
java23 자바 40 010-1111-2222

 

IFNULL 조건문
SELECT IFNULL(phone,'저장된 번호가 없습니다.') FROM user_tb WHERE user_id = 'java23';

# 조회 값
010-1111-2222

SELECT IFNULL(phone,'저장된 번호가 없습니다.') FROM user_tb WHERE user_id = 'ktae23';

# 조회 값
저장된 번호가 없습니다.

SELECT IFNULL(phone, 0) FROM user_tb WHERE user_id = 'ktae23';

# 조회 값
0

 

하지만 단지 해당 컬럼의 값이 없는게 아니라 일치하는 행 자체가 없을 수 있다.

이 경우엔 null이 저장된 행을 조회한 것이 아니기 때문에 아무런 값이 반환되지 않는다.

 

IFNULL 조건문 2
SELECT IFNULL(phone,'저장된 번호가 없습니다.') FROM user_tb WHERE user_id = 'kk100';

# 조회 값


SELECT IFNULL(phone,'저장된 번호가 없습니다.') FROM user_tb WHERE user_id = 'python23';

# 조회 값

 

때문에 이런 경우 EXISTS를 사용해 조회하길 원하는 대상의 ROW가 존재하는지 먼저 조회해야 한다.

 

EXISTS조건문
SELECT EXISTS(SELECT phone FROM user_tb WHERE user_id = 'ktae23');

# 조회 값
1

SELECT EXISTS(SELECT phone FROM user_tb WHERE user_id = 'python23');

# 조회 값
0

 

지금까지 설명한 조건부 조회를 위해 CASE - WHEN 구문을 이용하여 EXSIST 조건을 걸어주고, 존재할 경우 IFNULL을 사용해준다.

 

CASE - WHEN 조건문
SELECT CASE WHEN (조건문)    THEN (조건이 맞을 경우 실행 할 구문 | 반환값)
            WHEN (조건문)    THEN (조건이 맞을 경우 실행 할 구문 | 반환값)
            WHEN (조건문)    THEN (조건이 맞을 경우 실행 할 구문 | 반환값)
            ELSE (이외의 경우 실행 할 구문)
            END (조건문 종료)

 

 

조건부 조회 예제

예시 테이블

user_id user_name user_age phone
ktae23 타태 30 (NULL)
java23 자바 40 010-1111-2222

 

SELECT DISTINCT
    CASE WHEN(    # 1차 조건문 시작
        SELECT EXISTS(
                        SELECT phone
                        FROM user_tb 
                        WHERE user_id = '#{useId}'
                      ) = 1     # 1차 조건문 종료

    THEN    # 1차 조건이 맞을 경우 실행 할 구문 또는 반환 값
    		# (해당하는 행이 존재)

        CASE WHEN(    # 2차 조건문 시작 
                    SELECT IFNULL(phone,0)
                    FROM user_tb
                    WHERE user_id = #{useId}
                  ) = 0     # 2차 조건문 종료

        THEN 0    # 2차 조건이 맞을 경우 실행 할 구문 또는 반환 값
        		  # (해당하는 행이 존재하고 조회 값이 NULL)

        ELSE 1    # 2차 조건 이외의 경우 실행 할 구문 또는 반환 값
        		  # (해당하는 행이 존재하고 조회 값이 NULL이 아님)
        END    # 2차 조건문 종료

    ELSE 2    # 1차 조건 이외의 경우 실행 할 구문 또는 반환 값
    		  # (해당하는 행이 존재하지 않음)
              
    END AS phone    # 1차 조건문 종료

FROM user_tb

 

id가 'ktae23'일 경우 (행이 존재하고 값이 NULL)

# 조회 값
0

id가 'java23'일 경우 (행이 존재하고 값이 NULL이 아님)

# 조회 값
1

id가 'python23'일 경우 (행이 존재하지 않음)

# 조회 값
2
반응형

댓글