본문 바로가기
Data Science/SQL

[SQL/오답] 문자열 가공; CONCAT과 SUBSTR/UPPER/LOWER을 활용한 이름 표준화 (LeetCode1667 Easy)

by 에르모사 쩐뉴 2026. 2. 15.

1. Problem

Users 테이블의 name 컬럼에 제멋대로 섞여 있는 대소문자를 정제해야 한다. 오직 첫 글자만 대문자로, 나머지는 소문자로 변환하여 출력하는 것이 목표이다. 실무에서 이름이나 주소 등 텍스트 데이터를 통일성 있게 관리하기 위해 반드시 필요한 과정이다.

2. Solution

문자열을 분해한 뒤 각각 대소문자 처리를 거쳐 다시 조립하는 '추출-변환-결합' 전략을 사용한다.

  • SUBSTR(name, 1, 1): 1번 인덱스부터 1글자를 가져와 UPPER 처리한다.
  • SUBSTR(name, 2): 2번 인덱스부터 문자열 끝까지 가져와 LOWER 처리한다. 길이를 생략하면 자동으로 끝까지 추출하는 특성을 활용한다.
  • CONCAT: 처리된 두 조각을 하나의 문자열로 완성한다.

3. Takeaway (문자열 핸들링과 데이터 신뢰도)

데이터를 정밀하게 깎아내는 과정에서 분석가가 인지해야 할 객관적 원칙을 정리한다.

  • 1-based Index의 인지: Python이나 Java와 달리 SQL의 문자열 인덱스는 1부터 시작한다. 이 차이를 명확히 구분해야 원하는 위치의 문자를 정확히 타격할 수 있다.
  • 함수 중첩(Nesting)의 논리: CONCAT 안에 UPPER와 SUBSTR이 중첩되는 구조를 설계하는 능력은 복잡한 텍스트 데이터를 가공하는 기본기가 된다.
  • 데이터 정제의 가치: aLice, ALICE, alice를 Alice로 통일하는 것은 단순한 미관상의 문제가 아니다. 데이터의 중복을 제거하고 통계적 집계의 정확성을 확보하는 분석의 '기초 공사'와 같다.

https://leetcode.com/problems/fix-names-in-a-table/description/

 

Fix Names in a Table - LeetCode

Can you solve this real interview question? Fix Names in a Table - Table: Users +----------------+---------+ | Column Name | Type | +----------------+---------+ | user_id | int | | name | varchar | +----------------+---------+ user_id is the primary key (c

leetcode.com

Table: Users

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| user_id        | int     |
| name           | varchar |
+----------------+---------+
user_id is the primary key (column with unique values) for this table.
This table contains the ID and the name of the user. The name consists of only lowercase and uppercase characters.
 

Write a solution to fix the names so that only the first character is uppercase and the rest are lowercase.

Return the result table ordered by user_id.

The result format is in the following example.

 

Example 1:

Input: 
Users table:
+---------+-------+
| user_id | name  |
+---------+-------+
| 1       | aLice |
| 2       | bOB   |
+---------+-------+
Output: 
+---------+-------+
| user_id | name  |
+---------+-------+
| 1       | Alice |
| 2       | Bob   |
+---------+-------+

 

 

[SQL/Easy] Fix Names in a Table: 문자열 표준화 공식

1. 문제 풀이의 핵심: "자르고, 바꾸고, 붙여라"

하나의 컬럼 안에 있는 문자열을 두 부분(첫 글자 / 나머지)으로 나누어 각각 처리한 뒤 다시 합쳐야 합니다.

🛠 사용되는 주요 함수 (MySQL 기준)

  • CONCAT(A, B): A와 B 문자열을 하나로 합칩니다.
  • UPPER(str): 모든 문자를 대문자로 바꿉니다.
  • LOWER(str): 모든 문자를 소문자로 바꿉니다.
  • SUBSTR(str, 시작위치, 길이): 문자열의 특정 부분을 추출합니다. (또는 LEFT, RIGHT 활용)

2. 정답 쿼리 및 해설

SELECT user_id, 
       CONCAT(
           -- 1. 첫 글자만 추출해서 대문자로 변환
           UPPER(SUBSTR(name, 1, 1)), 
           -- 2. 두 번째 글자부터 끝까지 추출해서 소문자로 변환
           LOWER(SUBSTR(name, 2))
       ) AS name
FROM Users
ORDER BY user_id;

💡 팁: SUBSTR의 인자 활용

  • SUBSTR(name, 1, 1): 1번째 글자부터 1글자만 가져옵니다.
  • SUBSTR(name, 2): 2번째 글자부터 남은 글자 전체를 가져옵니다. (길이를 생략하면 끝까지 가져오는 특성을 이용!)

3. 출제자의 의도 분석

이 문제는 아주 간단해 보이지만, 지원자의 **'문자열 핸들링 디테일'**을 평가합니다.

① 문자열 인덱스 체계 (1-based Index)

많은 프로그래밍 언어가 0부터 시작하는 것과 달리, SQL은 대부분 1부터 시작합니다. 이 기본적인 차이를 인지하고 있는지 확인합니다.

② 복합 함수 사용 능력 (Function Nesting)

CONCAT 안에 UPPER를 넣고 그 안에 SUBSTR을 넣는 식으로, 함수를 중첩해서 원하는 결과를 설계할 수 있는지 봅니다.

  • 의도: "원하는 포맷을 만들기 위해 여러 함수를 논리적으로 조합할 수 있는가?"

③ 정렬(Sorting)의 습관화

문제 마지막에 Return... ordered by user_id라는 조건이 붙어 있습니다. 데이터 가공에 집중하다가 정렬 조건을 놓치지 않는 꼼꼼함을 체크합니다.


🚩 데이터 정제(Cleaning)의 중요성

"지저분한 데이터(Dirty Data)를 정보(Information)로 바꾸는 첫걸음"
실무에서 aLice, ALICE, alice가 섞여 있으면 통계를 낼 때 모두 다른 사람으로 인식될 수 있다.
분석 전에 이처럼 이름을 표준화하는 과정은 분석의 신뢰도를 결정하는 매우 중요한 기초 공사.