'Value440', 'Value345'처럼 문자열과 숫자가 결합된 형태로 저장된 열에서 최대값을 구하려면 MAX() 함수와 substring() 함수를 함께 사용하면 됩니다. 먼저 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1337
-> (
-> Value varchar(50)
-> );
Query OK, 0 rows affected (0.58 sec)
insert 명령을 사용해 테이블에 레코드를 삽입합니다.
mysql> insert into DemoTable1337 values('Value400');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1337 values('Value345');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1337 values('Value567');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1337 values('Value489');
Query OK, 1 row affected (0.22 sec)select 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1337;
위 쿼리는 다음과 같은 결과를 출력합니다.
+----------+
| Value |
+----------+
| Value400 |
| Value345 |
| Value567 |
| Value489 |
+----------+
4 rows in set (0.00 sec)
varchar 열에서 최대값 찾기
다음은 MySQL에서 varchar 타입 열의 최대값을 찾는 쿼리입니다. substring()으로 숫자 부분만 추출한 뒤, cast()를 이용해 decimal 타입으로 변환하고 그 결과에 MAX() 함수를 적용합니다.
mysql> select max(cast(substring(Value, 6) as decimal(10,2))) as MaximumValue from DemoTable1337;
실행 결과는 다음과 같습니다.
+--------------+
| MaximumValue |
+--------------+
| 567.00 |
+--------------+
1 row in set (0.04 sec)
쿼리 동작 원리
substring(Value, 6)은 문자열의 6번째 위치부터 끝까지, 즉 'Value'라는 접두사를 제외한 숫자 부분만 반환합니다. 예를 들어 'Value567'에서는 '567'이 추출됩니다. 이 값을 decimal(10,2)로 변환하면 문자열 비교가 아닌 숫자 비교가 가능해지므로, MAX() 함수가 정확한 최대값을 계산할 수 있습니다. 만약 접두사 길이가 다르다면 정규식이나 LOCATE(), REGEXP_REPLACE() 등을 활용해 숫자 부분만 추출하는 방식으로 응용할 수 있습니다.