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

MySQL에서 문자열 컬럼의 숫자 값만 캐스팅하여 업데이트하는 방법

MySQL에서 문자열 컬럼의 숫자 값만 캐스팅하여 업데이트하는 방법

MySQL에서는 CEIL() 함수와 CAST()를 함께 사용하여 VARCHAR 타입으로 저장된 문자열 값을 숫자로 변환할 수 있습니다. 이 글에서는 문자열 컬럼에 저장된 값을 정수 컬럼으로 캐스팅하고 업데이트하는 과정을 단계별로 살펴보겠습니다.

1. 테이블 생성

먼저 첫 번째 컬럼을 VARCHAR 타입으로 지정하여 테이블을 생성합니다.

mysql> create table DemoTable
    -> (
    -> Value varchar(20),
    -> UpdateValue int
    -> );
Query OK, 0 rows affected (1.08 sec)

2. 데이터 삽입

INSERT 명령어로 레코드를 추가합니다. 여기에는 숫자 형태의 문자열('100', '1')과 숫자가 아닌 문자열('false', 'true')이 함께 포함되어 있습니다.

mysql> insert into DemoTable(Value) values('100');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(Value) values('false');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(Value) values('true');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(Value) values('1');
Query OK, 1 row affected (0.07 sec)

3. 전체 레코드 확인

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

mysql> select *from DemoTable;

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

+-------+-------------+
| Value | UpdateValue |
+-------+-------------+
|   100 |        NULL |
| false |        NULL |
|  true |        NULL |
|     1 |        NULL |
+-------+-------------+
4 rows in set (0.00 sec)

4. 숫자 값 캐스팅 후 업데이트

다음 쿼리는 문자열 컬럼의 값을 숫자로 캐스팅하여 UpdateValue 컬럼에 반영합니다.

mysql> update DemoTable
    -> set UpdateValue=ceil(cast(Value AS char(7)));
Query OK, 4 rows affected (0.18 sec)
Rows matched: 4 Changed: 4 Warnings: 0

5. 결과 확인

업데이트 후 테이블을 다시 조회해 보겠습니다.

mysql> select *from DemoTable;

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

+-------+-------------+
| Value | UpdateValue |
+-------+-------------+
|   100 |        100 |
| false |          0 |
|  true |          0 |
|     1 |          1 |
+-------+-------------+
4 rows in set (0.00 sec)

동작 원리 및 참고 사항

CEIL(CAST(Value AS CHAR)) 구문은 문자열을 암묵적으로 숫자로 변환한 뒤 올림 처리합니다. MySQL에서는 숫자로 해석할 수 없는 문자열('false', 'true' 등)이 숫자로 변환될 때 0으로 처리되므로, 위 예제에서도 해당 행들은 0으로 업데이트된 것을 확인할 수 있습니다.

반면, 숫자로 변환 가능한 행만 선택적으로 업데이트하고 싶다면 REGEXP를 활용한 WHERE 절을 추가하는 방법도 유용합니다.

mysql> update DemoTable
    -> set UpdateValue = ceil(cast(Value AS unsigned))
    -> where Value regexp '^[0-9]+$';
Query OK, 2 rows affected (0.05 sec)
Rows matched: 2 Changed: 2 Warnings: 0

이렇게 하면 '100', '1'처럼 실제 숫자인 값만 변환되고, 'false'나 'true' 같은 문자열은 기존 상태 그대로 유지됩니다. 데이터의 특성에 따라 두 가지 방식 중 적절한 방법을 선택하시기 바랍니다.