다른 프로그래밍 언어와 마찬가지로 SQL(구조화 질의 언어)에도 데이터 흐름을 제어하는 조건문이 존재합니다. 대표적인 IF 함수는 주어진 조건이 참일 때 하나의 값을 반환하고, 거짓일 때는 다른 값(또는 아무것도 반환하지 않음)을 반환합니다. 이번 글에서는 MySQL을 기준으로 SQL의 IF 계열 함수를 자세히 살펴보겠습니다.
사전 준비: 샘플 테이블 만들기
이 글에서는 이름(name), 나이(age), 성별(gender) 정보를 담은 샘플 스키마를 사용합니다. 아래 SQL을 자신의 IDE나 SQL Fiddle에서 실행해 실습용 테이블을 먼저 생성해 보세요.
create table names ( id INT, name VARCHAR(50), age INT, gender VARCHAR(50) ); insert into names (id, name, age, gender) values (1, 'Bret Starkings', 55, 'M'); insert into names (id, name, age, gender) values (2, 'Bobbye Eyckel', 76, 'F'); insert into names (id, name, age, gender) values (3, 'Barbie Veschi', 50, 'F'); insert into names (id, name, age, gender) values (4, 'Electra Blazewicz', 47, 'F'); insert into names (id, name, age, gender) values (5, 'Estrella Borleace', 57, 'F'); insert into names (id, name, age, gender) values (6, 'Washington Pittwood', 75, 'M'); insert into names (id, name, age, gender) values (7, 'Phaedra Tertre', 27, 'F'); insert into names (id, name, age, gender) values (8, 'Nicolina Elie', 76, 'F'); insert into names (id, name, age, gender) values (9, 'Hugh Hughson', 86, 'M'); insert into names (id, name, age, gender) values (10, 'Dare Ravilious', 59, 'M'); insert into names (id, name, age, gender) values (11, 'Cad Levins', 13, 'M'); insert into names (id, name, age, gender) values (12, 'Sollie Kimbury', 33, 'M'); insert into names (id, name, age, gender) values (13, 'Elga Rearie', 61, 'F'); insert into names (id, name, age, gender) values (14, 'Cherey Terron', 54, 'F'); insert into names (id, name, age, gender) values (15, 'Abbie Kent', 23, 'F'); insert into names (id, name, age, gender) values (38, 'Nelia Picot', 2, 'F'); insert into names (id, name, age, gender) values (39, 'Benedetto Smithin', 33, 'M'); insert into names (id, name, age, gender) values (40, 'Rickie Maymand', 83, 'F'); insert into names (id, name, age, gender) values (41, 'Kristoforo Dashkov', 6, 'M'); insert into names (id, name, age, gender) values (42, 'Cherice Genty', 6, 'F'); insert into names (id, name, age, gender) values (43, 'Shirley Fake', 95, 'F'); insert into names (id, name, age, gender) values (44, 'Aeriel Plant', 36, 'F'); insert into names (id, name, age, gender) values (45, 'Halimeda Gook', 74, 'F'); insert into names (id, name, age, gender) values (46, 'Minor Harriot', 63, 'M'); insert into names (id, name, age, gender) values (47, 'Greggory Found', 61, 'M'); insert into names (id, name, age, gender) values (48, 'Vivien Braund', 94, 'F'); insert into names (id, name, age, gender) values (49, 'Gaylord Pochet', 96, 'M'); insert into names (id, name, age, gender) values (77, 'Nataline Sealand', 43, 'F')
IF() 함수
IF(expression ,expr_true, expr_false);
MySQL에서 IF 함수는 세 개의 매개변수를 받습니다. 첫 번째는 평가할 불리언(boolean) 표현식, 두 번째는 조건이 참일 때 반환할 값, 세 번째는 조건이 거짓일 때 반환할 값입니다.
다음 예제는 나이가 18세 이상인지 판별하여 결과를 OVER_18이라는 별칭 컬럼으로 출력합니다.
SELECT name, age, IF(age >= 18, "YES", "NO") AS OVER_18 FROM names;
위 쿼리는 각 레코드의 이름과 나이를 조회한 뒤, 조건 판별 결과를 OVER_18 컬럼으로 함께 반환합니다. 실행 결과의 일부는 아래와 같습니다.
| name | age | OVER_18 |
| Bret Starkings | 55 | YES |
| Bobbye Eyckel | 76 | YES |
| Barbie Veschi | 50 | YES |
| Electra Blazewicz | 47 | YES |
| Estrella Borleace | 57 | YES |
| Washington Pittwood | 75 | YES |
| Phaedra Tertre | 27 | YES |
| Nicolina Elie | 76 | YES |
| Hugh Hughson | 86 | YES |
| Dare Ravilious | 59 | YES |
| Cad Levins | 13 | NO |
결과를 보면 13살 Cad Levins만 NO로 표시되고, 나머지는 모두 YES로 출력된 것을 확인할 수 있습니다.
IFNULL() 함수
IFNULL()은 첫 번째 표현식이 NULL인지 검사하는 조건문입니다. 첫 번째 표현식이 NULL이면 두 번째 표현식을 반환하고, NULL이 아니면 첫 번째 표현식을 그대로 반환합니다.
IFNULL(NULL, 2) ⇒ 2 반환 IFNULL(0, 4) ⇒ 0 반환 SELECT name, IFNULL(age, "NOT ENTERED") AS age FROM names;
위 MySQL 문장은 age라는 컬럼을 반환하며, 나이 값이 NULL로 저장된 모든 레코드를 문자열 "NOT ENTERED"로 대체하여 출력합니다. NULL 값으로 인한 오류나 빈 화면을 방지할 때 매우 유용하게 사용됩니다.
NULLIF() 함수
NULLIF()는 반대로 동작하는 함수입니다. 함수에 전달된 두 표현식이 서로 같으면 NULL을 반환하고, 같지 않으면 첫 번째 표현식을 반환합니다.
SELECT name, NULLIF(name, age) FROM names;
위 예제는 이름과 나이를 비교하는 극단적인 사례입니다. 실무에서 이름과 나이가 일치하는 경우는 거의 없겠지만, 구문이 어떻게 작성되는지 이해하는 데는 충분합니다. 두 값이 같을 때 특정 연산을 제외하거나, 0으로 나누기 오류를 방지하는 등의 상황에서 NULLIF()가 유용하게 활용될 수 있습니다.
마치며
MySQL에는 데이터 흐름을 제어할 수 있는 여러 종류의 IF 계열 함수가 마련되어 있습니다. IF(), IFNULL(), NULLIF()의 개념은 사용 중인 어떤 데이터베이스에도 동일하게 적용할 수 있으며, 정확한 문법이 필요하다면 해당 DBMS의 공식 문서를 참고하는 것이 좋습니다.