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

MySQL에서 STR_TO_DATE 별칭 열을 찾을 수 없을 때? HAVING 절로 해결하는 방법

MySQL에서 STR_TO_DATE() 함수의 결과에 AS로 별칭(alias)을 지정한 뒤 WHERE 절에서 해당 별칭을 사용하면 "Unknown column(열을 찾을 수 없음)" 오류가 발생합니다. 이는 MySQL이 WHERE 절을 처리할 때 아직 SELECT 목록의 별칭이 정의되지 않기 때문입니다.

이 문제는 HAVING 절을 사용하면 간단히 해결할 수 있습니다. HAVING 절은 SELECT 이후에 평가되기 때문에 별칭을 참조할 수 있습니다. 실제 예제를 통해 살펴보겠습니다.

1. 테이블 생성

먼저 날짜가 문자열(varchar) 형태로 저장된 테이블을 만들어 보겠습니다.

mysql> create table DemoTable
    -> (
    -> AdmissionDate varchar(100)
    -> );
Query OK, 0 rows affected (0.55 sec)

2. 데이터 삽입

INSERT 명령어를 사용해 '일/월/년' 형식의 날짜 문자열을 여러 개 입력합니다.

mysql> insert into DemoTable values('10/12/2017');
Query OK, 1 row affected (0.18 sec)

mysql> insert into DemoTable values('01/11/2018');
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable values('31/01/2019');
Query OK, 1 row affected (0.18 sec)

mysql> insert into DemoTable values('09/06/2019');
Query OK, 1 row affected (0.16 sec)

mysql> insert into DemoTable values('19/04/2019');
Query OK, 1 row affected (0.23 sec)

3. 전체 데이터 조회

SELECT 문으로 테이블의 모든 레코드를 확인합니다.

mysql> select *from DemoTable;

출력 결과

+---------------+
| AdmissionDate |
+---------------+
| 10/12/2017    |
| 01/11/2018    |
| 31/01/2019    |
| 09/06/2019    |
| 19/04/2019    |
+---------------+
5 rows in set (0.00 sec)

4. STR_TO_DATE와 HAVING 절 활용

아래 쿼리는 STR_TO_DATE() 함수로 문자열 날짜를 DATE 타입으로 변환하고, 그 결과에 newDate라는 별칭을 부여한 뒤 HAVING 절에서 필터링합니다.

mysql> select STR_TO_DATE(AdmissionDate, '%d/%m/%Y') as newDate from DemoTable
    -> having newDate >= '2019-01-01';

출력 결과

+------------+
| newDate    |
+------------+
| 2019-01-31 |
| 2019-06-09 |
| 2019-04-19 |
+------------+
3 rows in set (0.00 sec)

위 결과를 보면 2019년 1월 1일 이후의 날짜 3건만 정상적으로 조회된 것을 확인할 수 있습니다.

추가 팁: WHERE 절에서 직접 함수 사용하기

HAVING 대신 WHERE 절을 꼭 사용해야 한다면, 별칭 대신 함수 호출 자체를 조건에 작성하면 됩니다.

mysql> select STR_TO_DATE(AdmissionDate, '%d/%m/%Y') as newDate from DemoTable
    -> where STR_TO_DATE(AdmissionDate, '%d/%m/%Y') >= '2019-01-01';

다만 이 방식은 같은 함수를 두 번 호출하므로 성능 면에서는 HAVING 절이나 서브쿼리를 활용하는 것이 더 유리할 수 있습니다. 데이터 양이 많다면 애초에 날짜를 DATE 타입 컬럼으로 저장하는 것이 가장 좋은 설계입니다.