Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 두 열 중 NULL이 아닌 값을 선택하는 4가지 방법

MySQL에서 두 개의 열을 비교하여 NULL이 아닌 값만 선택해야 하는 경우가 자주 있습니다. 예를 들어, 사용자 정보가 여러 열에 분산되어 있고 그중 하나만 값이 존재할 때 유용합니다. 이를 구현하는 방법은 다양하며, 대표적으로 네 가지 문법을 소개합니다.

방법 1: IFNULL() 함수 사용

IFNULL() 함수는 첫 번째 인자가 NULL이면 두 번째 인자를 반환하고, NULL이 아니면 첫 번째 인자를 그대로 반환합니다.

SELECT IFNULL(열이름1, 열이름2) AS 별칭 FROM 테이블명;

방법 2: COALESCE() 함수 사용

COALESCE() 함수는 인자 목록 중 NULL이 아닌 첫 번째 값을 반환합니다. 두 개 이상의 열에도 확장해서 사용할 수 있어 더욱 유연합니다.

SELECT COALESCE(열이름1, 열이름2) AS 별칭 FROM 테이블명;

방법 3: CASE 문 사용

CASE 문을 활용하면 조건 로직을 명시적으로 작성할 수 있습니다. 첫 번째 열이 NULL이 아니면 해당 값을, 그렇지 않으면 두 번째 열의 값을 반환합니다.

SELECT CASE
    WHEN 열이름1 IS NOT NULL THEN 열이름1
    ELSE 열이름2
END AS 별칭
FROM 테이블명;

방법 4: IF() 함수 사용

MySQL 전용 함수인 IF()를 사용해도 동일한 결과를 얻을 수 있습니다. 조건이 참이면 두 번째 인자, 거짓이면 세 번째 인자를 반환합니다.

SELECT IF(열이름1 IS NULL, 열이름2, 열이름1) AS NotNULLValue FROM 테이블명;

실습용 테이블 생성하기

위 문법들을 직접 확인하기 위해 간단한 테이블을 만들어 보겠습니다. Name과 Age 열 중 하나는 반드시 NULL이 되도록 데이터를 구성했습니다.

mysql> create table SelectNotNullColumnsDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> Name varchar(20),
    -> Age int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.86 sec)

다음으로 샘플 데이터를 삽입합니다. 첫 번째 레코드는 Age가, 두 번째 레코드는 Name이 NULL입니다.

mysql> insert into SelectNotNullColumnsDemo(Name,Age) values('John',NULL);
Query OK, 1 row affected (0.16 sec)
mysql> insert into SelectNotNullColumnsDemo(Name,Age) values(NULL,23);
Query OK, 1 row affected (0.16 sec)

테이블의 전체 데이터를 조회해 보면 다음과 같습니다.

mysql> select *from SelectNotNullColumnsDemo;
+----+------+------+
| Id | Name | Age  |
+----+------+------+
|  1 | John | NULL |
|  2 | NULL |   23 |
+----+------+------+
2 rows in set (0.00 sec)

각 방법별 실행 결과 확인

1. IFNULL() 적용

mysql> select ifnull(Name,Age) as NotNULLValue from SelectNotNullColumnsDemo;
+--------------+
| NotNULLValue |
+--------------+
| John         |
| 23           |
+--------------+
2 rows in set (0.00 sec)

2. COALESCE() 적용

mysql> select coalesce(Name,Age) as NotNULLValue from SelectNotNullColumnsDemo;
+--------------+
| NotNULLValue |
+--------------+
| John         |
| 23           |
+--------------+
2 rows in set (0.00 sec)

3. CASE 문 적용

mysql> select case
    -> when Name is not null then Name else Age
    -> end as NotNULLValue
    -> from SelectNotNullColumnsDemo;
+--------------+
| NotNULLValue |
+--------------+
| John         |
| 23           |
+--------------+
2 rows in set (0.00 sec)

4. IF() 적용

mysql> select if(Name is NULL,Age,Name) as NotNULLValue from SelectNotNullColumnsDemo;
+--------------+
| NotNULLValue |
+--------------+
| John         |
| 23           |
+--------------+
2 rows in set (0.00 sec)

정리 및 활용 팁

네 가지 방법 모두 동일한 결과를 반환하지만, 상황에 따라 적합한 선택이 달라집니다. COALESCE()는 SQL 표준 함수이므로 다른 데이터베이스(MySQL, PostgreSQL, Oracle 등)와의 호환성이 필요하다면 가장 권장됩니다. IFNULL()IF()는 MySQL 전용 문법으로 코드가 간결하지만 이식성이 떨어집니다. CASE 문은 조건이 복잡해지거나 세 개 이상의 열을 처리해야 할 때 가독성 면에서 유리합니다. 프로젝트의 요구 사항과 DB 호환성을 고려해 적절한 방법을 선택하세요.