0Pricing
SQL Interview Prep · 강의

문자열 파싱과 서식 지정

방언별 SUBSTRING, 위치 찾기, 분할, 대소문자 변환을 알아봅니다.

문자열 파싱과 서식 지정은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

문자열 함수가 출제되는 이유

실제 데이터는 지저분합니다. 분할해야 하는 전체 이름, 추출해야 하는 이메일 도메인, 식별자 안에 포함된 코드, 일관되지 않은 대소문자 등이 있습니다. 면접관은 문자열 조작을 통해 데이터를 스크립트로 내보내지 않고도 텍스트를 정리하고 재구성할 수 있는지 확인합니다.

날짜 함수와 마찬가지로 문자열 함수도 표준화가 느슨하므로, 목표는 개념과 일반적인 변형을 아는 것입니다.

  • 부분 문자열 추출과 위치 찾기
  • 문자열 연결
  • 분할과 치환
  • 대소문자 변환과 공백 제거

SUBSTRING과 위치

SUBSTRING(s FROM start FOR length)는 SQL 표준 형식이며, 대부분의 엔진은 SUBSTRING(s, start, length)도 지원합니다. 문자열 위치는 1부터 시작하므로, 0부터 시작하는 언어에 익숙한 프로그래머가 자주 실수합니다.

POSITION(sub IN s)(또는 STRPOS/CHARINDEX)는 부분 문자열이 시작되는 위치를 찾으며, 찾지 못하면 0을 반환합니다.

SELECT
  SUBSTRING('INV-2024-042' FROM 5 FOR 4) AS year,   -- '2024'
  POSITION('-' IN 'INV-2024-042')        AS first_dash; -- 4

이메일 도메인 추출

대표적인 실습 예제입니다. @의 위치를 찾은 다음 그 뒤의 모든 내용을 가져옵니다. POSITION과 SUBSTRING을 조합하는 것이 이식성 있는 방법입니다.

PostgreSQL에서는 SPLIT_PART(email, '@', 2)도 사용할 수 있습니다. 더 읽기 쉽고 관용적인 답변이므로 언급할 가치가 있습니다.

-- Portable
SELECT SUBSTRING(email FROM POSITION('@' IN email) + 1) AS domain
FROM users;

-- Postgres idiom
SELECT SPLIT_PART(email, '@', 2) AS domain FROM users;

방언별 문자열 연결

문자열 연결은 방언에 따라 다르므로, 면접관은 지원자가 각 변형을 알고 있기를 기대합니다.

  • SQL 표준 / PostgreSQL / 오라클: || 연산자
  • MySQL: CONCAT(a, b, c)(|| 연산자는 기본적으로 논리적 OR입니다.)
  • SQL 서버: 문자열에는 +를 사용하거나 CONCAT()을 사용합니다.

CONCAT()은 NULL을 빈 문자열로 처리하지만, ||와 +는 일반적으로 피연산자 중 하나라도 NULL이면 전체 결과를 NULL로 만듭니다. 이는 미묘한 버그의 원인이 될 수 있습니다.

-- Postgres
SELECT first_name || ' ' || last_name AS full_name FROM people;

-- MySQL / SQL Server
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM people;

NULL 문자열 연결 함정

앞의 장면에 이어서 살펴보겠습니다. last_name이 NULL이면 PostgreSQL에서 first_name || ' ' || last_name은 NULL을 반환하여 이름 전체를 없애 버립니다.

방어적인 해결 방법은 NULL이 될 수 있는 부분에 COALESCE를 사용하거나, 구분자와 함께 연결하는 CONCAT_WS를 사용하는 것입니다. CONCAT_WS는 NULL을 건너뛰고 값이 있는 부분 사이에만 구분자를 삽입합니다.

-- Safe in Postgres / MySQL
SELECT CONCAT_WS(' ', first_name, last_name) AS full_name FROM people;

-- Or guard each part
SELECT first_name || ' ' || COALESCE(last_name, '') FROM people;

문자열 분할

"하이픈으로 연결된 코드에서 세 번째 부분을 가져오십시오"라는 문제는 문자열 분할을 평가합니다. PostgreSQL의 SPLIT_PART(s, delim, n)은 n번째 부분을 바로 반환하므로 가장 깔끔한 도구입니다.

MySQL에는 직접적인 분할 함수가 없습니다. 관용적인 방법은 중첩된 SUBSTRING_INDEX를 사용하는 것입니다. 먼저 처음 n개 부분을 가져온 다음, 그 부분들 중 마지막 부분을 가져옵니다.

-- Postgres
SELECT SPLIT_PART('a-b-c-d', '-', 3); -- 'c'

-- MySQL: third part of a-b-c-d
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a-b-c-d', '-', 3), '-', -1); -- 'c'

치환, 공백 제거와 패딩

면접에서 바로 떠올릴 수 있어야 하는 정리 작업은 다음과 같습니다.

  • REPLACE(s, from, to)는 모든 출현을 다른 값으로 바꿉니다.
  • TRIM(s)은 앞뒤 공백을 제거하고, TRIM(BOTH 'x' FROM s)는 특정 문자를 제거합니다.
  • LPAD(s, len, ch) / RPAD는 고정 너비에 맞춰 채우며, 식별자 앞을 0으로 채울 때 유용합니다.
SELECT
  REPLACE('555.123.4567', '.', '-') AS phone,   -- 555-123-4567
  TRIM('   hello   ')               AS clean,   -- 'hello'
  LPAD('42', 6, '0')                AS padded;   -- '000042'

대소문자 변환과 길이

텍스트를 비교하거나 그룹화하기 전에 대소문자를 정규화하는 것은 필수입니다. UPPER와 LOWER는 거의 모든 환경에서 사용할 수 있고, INITCAP(PostgreSQL/오라클)은 단어의 첫 글자를 대문자로 만듭니다.

LENGTH(s)는 대부분의 엔진에서 문자 수를 반환하지만 주의해야 합니다. SQL 서버에서는 LEN()을 사용하며, 일부 설정에서는 LENGTH가 여러 바이트 문자에 대해 바이트 수를 셉니다. ASCII가 아닌 데이터를 다룰 때 이 세부 사항을 언급하십시오.

SELECT
  LOWER(email)        AS email_norm,
  INITCAP(city)       AS city_pretty,  -- Postgres
  LENGTH(description)  AS chars
FROM places;

LIKE를 넘어선 패턴 일치

LIKE만으로 충분하지 않을 때 면접관은 정규식에 대한 이해를 확인하고 싶어 합니다. PostgreSQL은 ~ 연산자와 REGEXP_REPLACE / REGEXP_MATCHES를 제공하고, MySQL은 REGEXP / REGEXP_SUBSTR를 제공합니다.

예를 들어 전화번호 문자열에서 숫자만 남길 수 있습니다. 정규식을 사용하면 여러 REPLACE 호출을 이어 쓰는 대신 한 줄로 처리할 수 있습니다.

-- Postgres: strip non-digits
SELECT REGEXP_REPLACE('(555) 123-4567', '[^0-9]', '', 'g')
  AS digits; -- '5551234567'

더 깊이 있는 예제: 이름 정규화와 중복 제거

여러 정리 작업을 결합한 문제입니다. 이름에 불필요한 공백과 대소문자 혼용이 포함되어 잘못된 중복으로 처리된다고 가정해 보겠습니다. 먼저 정규화한 다음 그룹화합니다.

공백을 제거하고, 정규식으로 내부의 연속된 공백을 하나로 줄인 뒤, 고유 값을 세기 전에 소문자로 변환하십시오. 면접관이 높이 평가하는 것이 바로 이런 다단계 사고입니다.

SELECT
  LOWER(REGEXP_REPLACE(TRIM(name), '\s+', ' ', 'g')) AS norm_name,
  COUNT(*) AS occurrences
FROM contacts
GROUP BY 1
ORDER BY occurrences DESC;

문자열을 숫자와 날짜로 변환하기

문자열 열에는 실제로 숫자나 날짜여야 하는 값이 들어 있는 경우가 많습니다. CAST(s AS INTEGER) 또는 PostgreSQL의 축약형인 s::int로 변환할 수 있지만, 잘못된 입력이 있으면 실패합니다.

날짜의 경우 TO_DATE(s, 'YYYY-MM-DD')(PostgreSQL/오라클)는 명시적인 형식 마스크를 사용해 구문 분석합니다. 일과 월의 순서가 모호해지는 문제를 없애므로 가장 안전한 방법입니다.

SELECT
  CAST(qty_text AS INTEGER)            AS qty,
  TO_DATE(order_str, 'DD/MM/YYYY')     AS order_date
FROM staging;

빠른 확인

문자열 연결에서 NULL이 어떻게 동작하는지 생각해 보십시오.

복습: 문자열 구문 분석과 형식 지정

면접에서 기억해야 할 핵심 내용:

  • 문자열 위치는 1부터 시작합니다. SUBSTRING과 POSITION을 함께 사용하면 위치를 기준으로 추출할 수 있습니다.
  • ||(PostgreSQL), CONCAT(MySQL) 또는 +(SQL 서버)로 연결하고 NULL 전파를 기억하십시오. CONCAT_WS를 사용하는 것이 좋습니다.
  • PostgreSQL에서는 SPLIT_PART로, MySQL에서는 중첩된 SUBSTRING_INDEX로 분할합니다.
  • REPLACE, TRIM, LPAD, UPPER/LOWER로 정리하고 정규화하며, 복잡한 경우에는 정규식을 사용합니다.
  • 잘못된 중복을 피하려면 그룹화하기 전에 대소문자와 공백을 정규화하십시오.

자주 묻는 질문

“문자열 파싱과 서식 지정” 강의는 무료인가요?

네 — “문자열 파싱과 서식 지정” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.

“문자열 파싱과 서식 지정”에서 뭘 배우나요?

방언별 SUBSTRING, 위치 찾기, 분할, 대소문자 변환을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“문자열 파싱과 서식 지정” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 날짜 연산과 간격
  2. 날짜 자르기와 구간화
  3. 문자열 파싱과 서식 지정
  4. 시간대와 타임스탬프
← SQL Interview Prep(으)로 돌아가기