무한루프/개발, 업무

MS-SQL 알파벳 증가 표기 query

시원한생맥주 2025. 2. 21. 15:02

 

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는 AZ(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. 후기

 

아오.. 생각보다 로직 만드는데 시간이 걸렸다.

머리가 많이 굳었군..

 

 

 

 

 

MS-SQL 알파벳 query
MS-SQL 알파벳 query