wisePocket

[MySQL] 조건문 정리 if, ifnull, case when, nvl 사용 본문

Database/MySQL - RDBMS

[MySQL] 조건문 정리 if, ifnull, case when, nvl 사용

ohnyong 2023. 8. 7. 17:00

MySQL 조건문

프로그래머스 문제 풀이 중 조건문을 사용해야 해서 정리하고자 한다.


1. IF

IF(조건문, 참일 때의 값, 거짓일 때의 값)
기본 사용 방식은 엑셀의 =IF() 와 같다.
SELECT IF(2 > 1, 'TRUE', 'FALSE') AS result

아래와 같이 특정 컬럼 값의 조건에 의해서, 다른 컬럼의 출력하는 분기 처리도 가능하다.
엑셀 처럼 중첩 IF 의 사용도 가능하다.

SELECT IF(column_name is null, column_1, columnj_2) AS result​

문제 안에서 "이때 냉동시설 여부NULL인 경우, 'N'으로 출력시켜 주시고" 이 부분을 이렇게 표현 할 수 있다.

-- 코드를 입력하세요
select * from food_warehouse;

select warehouse_id, warehouse_name, address, (if(freezer_yn is null, 'N', 'Y')) freezer_yn
    from food_warehouse
    where address like "경기도%"
    order by warehouse_id asc;

 

2. ifnull

IFNULL() 함수는 해당 필드의 값이 NULL 을 반환할 때, 지정한 값으로 대체하여 출력해준다.
위 문제에 적용하기 가장 적합한 함수이다.


문제 안에서 "이때 냉동시설 여부가 NULL인 경우, 'N'으로 출력시켜 주시고" 이 부분을 이렇게 표현 할 수 있다.
-- 코드를 입력하세요
select * from food_warehouse;

select warehouse_id, warehouse_name, address, (ifnull(freezer_yn, 'N')) freezer_yn
    from food_warehouse
    where address like "경기도%"
    order by warehouse_id asc;​

null 인 부분의 문제만 해결하기 때문에 해당 문제와는 가장 근접하지만 null 이 아닌 부분은 무시하게 된다.

 

3. CASE WHEN

CASE value 혹은 조건 WHEN value1 THEN result1 WHEN value2 THEN result2 … [ELSE else_result] END
WHEN 과 THEN 은 쌍을 이루어 사용, Java 나 JavaScript 의 switch case 와 흡사하다.

문제 안에서 "이때 냉동시설 여부 NULL인 경우, 'N'으로 출력시켜 주시고" 이 부분을 이렇게 표현 할 수 있다.
-- 코드를 입력하세요
select * from food_warehouse;

select  warehouse_id, 
        warehouse_name, 
        address, 
        (CASE
            WHEN freezer_yn is null THEN 'N'
            ELSE freezer_yn
        END	) as freezer_yn 
    from food_warehouse
    where address like "경기도%"
    order by warehouse_id asc;

freezer_yz이 NULL인 경우에 'N'을 입력,
Else 그외 경우는 그대로 들어가도록 입력. 무언가 조건이 여러개 달려야 하는 경우 사용하면 시인성이 좋을 것 같다.

4. NVL

NVL(value1, value2)
컬럼 값이 NULL 이면 value2 을 출력하고, NULL이 아니라면 value1 컬럼 값을 출력한다.
ORACLE에서 NULL 처리를 위해 사용하는 NVL, NVL2의 함수이다. 
MySQL에서는 2. IFNULL을 사용하면 된다.
Oracle의 예시는 다음과 같다.
select warehouse_id, warehouse_name, address, NVL(freezer_yn, 'N') as freezer_yn
    from food_warehouse
    where address like '경기도%'
    order by warehouse_id;​