MS-SQL에서 숫자를 알파벳으로 변환하는 방법을 공부해 보자.
프로젝트에서 유니크한 코드부여하는 로직을 만들어야 하는데
어떤 특정 코드를 가진 아이템이 생성되면 순차적으로 영문코드를 뒤로 붙여줘야 한다.
예를 들어
QWE코드의 첫 번째 생성된 아이템이면 QWEAA
두 번째 생성된 아이템이면 QWEAB 이런 식이다.
1. 기본 개념
숫자를 알파벳으로 변환하는 과정은 아래와 같다.
// 한자리 표현
1 = A
2 = B
...
26 = Z
// 두자리 표현
1 = AA
2 = AB
...
26 = AZ
27 = BA
...
이런 식으로 연속된 숫자를 알파벳으로 변환하는 방법을 알아보자.
2. ASCII 코드 활용
ASCII()와 CHAR() 함수를 사용하여 문자와 숫자를 변환할 수 있다.
-- 대문자 A~Z ASCII 값
SELECT ascii('A'); -- 65
SELECT ascii('B'); -- 66
SELECT ascii('C'); -- 67
SELECT ascii('D'); -- 68
SELECT ascii('E'); -- 69
SELECT ascii('F'); -- 70
SELECT ascii('G'); -- 71
SELECT ascii('H'); -- 72
SELECT ascii('I'); -- 73
SELECT ascii('J'); -- 74
SELECT ascii('K'); -- 75
SELECT ascii('L'); -- 76
SELECT ascii('M'); -- 77
SELECT ascii('N'); -- 78
SELECT ascii('O'); -- 79
SELECT ascii('P'); -- 80
SELECT ascii('Q'); -- 81
SELECT ascii('R'); -- 82
SELECT ascii('S'); -- 83
SELECT ascii('T'); -- 84
SELECT ascii('U'); -- 85
SELECT ascii('V'); -- 86
SELECT ascii('W'); -- 87
SELECT ascii('X'); -- 88
SELECT ascii('Y'); -- 89
SELECT ascii('Z'); -- 90
-- 소문자 a~z ASCII 값
SELECT ascii('a'); -- 97
SELECT ascii('b'); -- 98
SELECT ascii('c'); -- 99
SELECT ascii('d'); -- 100
SELECT ascii('e'); -- 101
SELECT ascii('f'); -- 102
SELECT ascii('g'); -- 103
SELECT ascii('h'); -- 104
SELECT ascii('i'); -- 105
SELECT ascii('j'); -- 106
SELECT ascii('k'); -- 107
SELECT ascii('l'); -- 108
SELECT ascii('m'); -- 109
SELECT ascii('n'); -- 110
SELECT ascii('o'); -- 111
SELECT ascii('p'); -- 112
SELECT ascii('q'); -- 113
SELECT ascii('r'); -- 114
SELECT ascii('s'); -- 115
SELECT ascii('t'); -- 116
SELECT ascii('u'); -- 117
SELECT ascii('v'); -- 118
SELECT ascii('w'); -- 119
SELECT ascii('x'); -- 120
SELECT ascii('y'); -- 121
SELECT ascii('z'); -- 122
SELECT CHAR(64); -- @
SELECT CHAR(65); -- A
SELECT CHAR(66); -- B
SELECT CHAR(67); -- C
SELECT CHAR(68); -- D
SELECT CHAR(69); -- E
SELECT CHAR(70); -- F
SELECT CHAR(71); -- G
SELECT CHAR(72); -- H
SELECT CHAR(73); -- I
SELECT CHAR(74); -- J
SELECT CHAR(75); -- K
SELECT CHAR(76); -- L
SELECT CHAR(77); -- M
SELECT CHAR(78); -- N
SELECT CHAR(79); -- O
SELECT CHAR(80); -- P
SELECT CHAR(81); -- Q
SELECT CHAR(82); -- R
SELECT CHAR(83); -- S
SELECT CHAR(84); -- T
SELECT CHAR(85); -- U
SELECT CHAR(86); -- V
SELECT CHAR(87); -- W
SELECT CHAR(88); -- X
SELECT CHAR(89); -- Y
SELECT CHAR(90); -- Z
SELECT CHAR(91); -- [
3. 문자 변환 로직 만들기(뒷자리)
알파벳이 26자를 넘어가면 두 자리(AZ, BA 등)로 증가하는 패턴이 필요하다.
중요한 건 앞자리는 1부터 26까지는 A이나, 27부터는 B, 이렇게 증가하고, 뒷자리는 계속 A~Z를 순환해야 한다는 거다.
우선 뒷자리를 먼저 만들어 보자.
REPLACE(), CHAR() 함수를 이용해서 변환할 수 있다.
SELECT REPLACE(CHAR(((1) % 26) + 64), '@', 'Z');
SELECT REPLACE(CHAR(((2) % 26) + 64), '@', 'Z');
SELECT REPLACE(CHAR(((3) % 26) + 64), '@', 'Z');
...
SELECT REPLACE(CHAR(((25) % 26) + 64), '@', 'Z');
SELECT REPLACE(CHAR(((26) % 26) + 64), '@', 'Z');
SELECT REPLACE(CHAR(((27) % 26) + 64), '@', 'Z');
...
1. (n % 26) + 64의 의미
- %(모듈로, 나머지 연산자)를 사용하여 n을 26으로 나눈 나머지를 구함.
- 거기에 64를 더하면 ASCII 코드 값이 됨.
- 즉, (n % 26) + 64는 A
Z(6590) 범위의 문자를 얻기 위한 계산식!
예를 들어:
- 1 % 26 → 1, 그리고 1 + 64 → 65 (즉, CHAR(65) = 'A')
- 2 % 26 → 2, 그리고 2 + 64 → 66 (즉, CHAR(66) = 'B')
- 3 % 26 → 3, 그리고 3 + 64 → 67 (즉, CHAR(67) = 'C')
2. CHAR(((n) % 26) + 64)의 결과
n 값 (n % 26) + 64 계산 CHAR() 결과
1 | (1 % 26) + 64 = 65 | 'A' |
2 | (2 % 26) + 64 = 66 | 'B' |
3 | (3 % 26) + 64 = 67 | 'C' |
25 | (25 % 26) + 64 = 89 | 'Y' |
26 | (26 % 26) + 64 = 64 | '@' |
27 | (27 % 26) + 64 = 65 | 'A' |
→ n = 26일 때 ASCII 값이 **64('@')**이 됨!
→ n = 27일 때 다시 65('A')로 시작함!
3. REPLACE(CHAR(((n) % 26) + 64), '@', 'Z')의 역할
- REPLACE(문자열, '찾을 문자', '바꿀 문자') 함수는 특정 문자를 다른 문자로 변경하는 함수.
- '@'를 'Z'로 바꾸려 하지만,
- n=26일 때만 CHAR(64) = '@'이므로, 이 경우에만 '@'가 'Z'로 변경됨.
- 다른 경우에는 A~Z 문자가 나오므로 변경이 일어나지 않음.
4. 실행 결과 분석
SQL 문 CHAR(((n) % 26) + 64) 결과 REPLACE() 결과
SELECT REPLACE(CHAR(((1) % 26) + 64), '@', 'Z'); | 'A' | 'A' |
SELECT REPLACE(CHAR(((2) % 26) + 64), '@', 'Z'); | 'B' | 'B' |
SELECT REPLACE(CHAR(((3) % 26) + 64), '@', 'Z'); | 'C' | 'C' |
SELECT REPLACE(CHAR(((25) % 26) + 64), '@', 'Z'); | 'Y' | 'Y' |
SELECT REPLACE(CHAR(((26) % 26) + 64), '@', 'Z'); | '@' | 'Z' |
SELECT REPLACE(CHAR(((27) % 26) + 64), '@', 'Z'); | 'A' | 'A' |
3. 문자 변환 로직 만들기(앞자리)
이젠 앞자리를 만들어보자.
SELECT REPLACE(CHAR(((1+25) / 26) + 64), '@', '*');
SELECT REPLACE(CHAR(((2+25) / 26) + 64), '@', '*');
...
SELECT REPLACE(CHAR(((24+25) / 26) + 64), '@', '*');
SELECT REPLACE(CHAR(((25+25) / 26) + 64), '@', '*');
SELECT REPLACE(CHAR(((26+25) / 26) + 64), '@', '*');
SELECT REPLACE(CHAR(((27+25) / 26) + 64), '@', '*');
...
SELECT REPLACE(CHAR(((228+25) / 26) + 64), '@', '*');
1. CHAR(((n + 25) / 26) + 64) 분석
- n은 각 쿼리에서 다르게 설정된 숫자.
- (n + 25) / 26은 (n)을 26으로 나누고 몫을 구하는 연산임.
- 그 결과에 64를 더하면, CHAR(65)부터 CHAR(90)까지 해당하는 알파벳 문자들이 나옴.
2. 각 쿼리 분석
1. SELECT REPLACE(CHAR(((1+25) / 26) + 64), '@', '*');
- ((1 + 25) / 26) + 64
- (1 + 25) → 26
- 26 / 26 → 1
- 1 + 64 → 65
- CHAR(65) → 'A'
- REPLACE('A', '@', '*')는 'A'에 '@'가 없으므로 결과는 'A'.
2. SELECT REPLACE(CHAR(((27+25) / 26) + 64), '@', '*');
- ((27 + 25) / 26) + 64
- (27 + 25) → 52
- 52 / 26 → 2
- 2 + 64 → 66
- CHAR(66) → 'B'
- REPLACE('B', '@', '*')는 'B'에 '@'가 없으므로 결과는 'B'.
3. SELECT REPLACE(CHAR(((228+25) / 26) + 64), '@', '*');
- ((228 + 25) / 26) + 64
- (228 + 25) → 253
- 253 / 26 → 9
- 9 + 64 → 73
- CHAR(73) → 'I'
- REPLACE('I', '@', '*')는 'I'에 '@'가 없으므로 결과는 'I'.
실행 결과 분석
쿼리 결과
SELECT REPLACE(CHAR(((1+25) / 26) + 64), '@', '*'); | A |
SELECT REPLACE(CHAR(((2+25) / 26) + 64), '@', '*'); | A |
SELECT REPLACE(CHAR(((24+25) / 26) + 64), '@', '*'); | A |
SELECT REPLACE(CHAR(((25+25) / 26) + 64), '@', '*'); | A |
SELECT REPLACE(CHAR(((26+25) / 26) + 64), '@', '*'); | A |
SELECT REPLACE(CHAR(((27+25) / 26) + 64), '@', '*'); | B |
SELECT REPLACE(CHAR(((228+25) / 26) + 64), '@', '*'); | I |
4. 문자 변환 로직 최종
두 가지 쿼리를 합쳐서 알파벳이 26자를 넘어가면 두 자리(AZ, BA 등)로 증가하는 패턴 작성.
SELECT REPLACE( CHAR(((1+25) / 26)+64),'@','*') + REPLACE( CHAR(((1) % 26)+64),'@','Z')
SELECT REPLACE( CHAR(((2+25) / 26)+64),'@','*') + REPLACE( CHAR(((2) % 26)+64),'@','Z')
...
SELECT REPLACE( CHAR(((25+25) / 26)+64),'@','*') + REPLACE( CHAR(((25) % 26)+64),'@','Z')
SELECT REPLACE( CHAR(((26+25) / 26)+64),'@','*') + REPLACE( CHAR(((26) % 26)+64),'@','Z')
SELECT REPLACE( CHAR(((27+25) / 26)+64),'@','*') + REPLACE( CHAR(((27) % 26)+64),'@','Z')
SELECT REPLACE( CHAR(((28+25) / 26)+64),'@','*') + REPLACE( CHAR(((28) % 26)+64),'@','Z')
...
SELECT REPLACE( CHAR(((51+25) / 26)+64),'@','*') + REPLACE( CHAR(((51) % 26)+64),'@','Z')
SELECT REPLACE( CHAR(((52+25) / 26)+64),'@','*') + REPLACE( CHAR(((52) % 26)+64),'@','Z')
SELECT REPLACE( CHAR(((53+25) / 26)+64),'@','*') + REPLACE( CHAR(((53) % 26)+64),'@','Z')
...
5. 후기
아오.. 생각보다 로직 만드는데 시간이 걸렸다.
머리가 많이 굳었군..
'무한루프 > 개발, 업무' 카테고리의 다른 글
스프링 부트(Spring Boot), 마이바티스(Mybatis), 메이븐(Maven) 백엔드 연동 설정(1) (0) | 2025.02.25 |
---|---|
요즘 다시 공부 중인 스프링 프레임워크 (0) | 2025.02.24 |
MariaDB 설치 후 DBeaver 설치 및 연결하기 (0) | 2025.02.24 |
Java에서 Word 파일 다루기 - Apache POI 사용법 (0) | 2025.02.24 |
오큘러스 고 (Oculus Go) 개발자 모드 변경 & 해상도 조정 문제 해결기 (0) | 2025.02.23 |