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

MySQL에서 VARCHAR 필드의 숫자 값 최대값 구하기 – CAST 함수 활용법

MySQL에서 VARCHAR 타입 필드에 저장된 숫자 값의 최대값을 구하려면 MAX() 함수와 CAST() 함수를 함께 사용해야 합니다. VARCHAR는 문자열 타입이므로 CAST 없이 MAX()만 사용하면 숫자 크기가 아닌 문자열 기준으로 비교되어 엉뚱한 결과가 반환될 수 있습니다.

1단계: 테이블 생성

먼저 예제에 사용할 테이블을 만들어 보겠습니다.

mysql> create table findMaxValueInVarcharField
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Value varchar(200)
-> );
Query OK, 0 rows affected (1.09 sec)

2단계: 데이터 삽입

INSERT 명령을 사용해 테이블에 샘플 레코드를 추가합니다.

mysql> insert into findMaxValueInVarcharField(Value) values('200');
Query OK, 1 row affected (0.14 sec)

mysql> insert into findMaxValueInVarcharField(Value) values('1000');
Query OK, 1 row affected (0.25 sec)

mysql> insert into findMaxValueInVarcharField(Value) values('899474');
Query OK, 1 row affected (0.18 sec)

mysql> insert into findMaxValueInVarcharField(Value) values('39474');
Query OK, 1 row affected (0.15 sec)

mysql> insert into findMaxValueInVarcharField(Value) values('4958');
Query OK, 1 row affected (0.12 sec)

3단계: 전체 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select * from findMaxValueInVarcharField;

실행 결과는 다음과 같습니다.

+----+--------+
| Id | Value |
+----+--------+
| 1 | 200 |
| 2 | 1000 |
| 3 | 899474 |
| 4 | 39474 |
| 5 | 4958 |
+----+--------+
5 rows in set (0.00 sec)

4단계: CAST를 활용한 최대값 조회

VARCHAR 필드의 숫자 값 중 최대값을 구하는 핵심 쿼리입니다. CAST(Value AS UNSIGNED)로 문자열을 부호 없는 정수로 변환한 뒤 MAX() 함수를 적용합니다.

mysql> select max(cast(Value as unsigned)) AS MaximumValueFromVarcharField from
findMaxValueInVarcharField;

실행 결과는 다음과 같습니다.

+------------------------------+
| MaximumValueFromVarcharField |
+------------------------------+
| 899474 |
+------------------------------+
1 row in set (0.00 sec)

왜 CAST 변환이 필요한가?

VARCHAR 필드에 대해 MAX()를 그대로 실행하면 MySQL은 해당 값을 숫자가 아닌 문자열로 비교합니다. 예를 들어 '1000'과 '200'을 비교하면 문자열 기준으로는 첫 글자 '1'과 '2'를 비교하기 때문에 '200'이 더 크다고 판단됩니다. 따라서 CAST() 또는 CONVERT() 함수로 명시적으로 숫자 타입으로 변환한 후 집계해야 정확한 최대값을 얻을 수 있습니다.

또한 필드에 숫자가 아닌 값이 섞여 있으면 CAST 시 경고가 발생하고 해당 값은 0으로 처리되므로, 실무에서는 데이터 정합성을 먼저 점검하는 것이 좋습니다.