취미생활/프로그래밍

MSSQL 문자열 공백, 특수문자, 자르기

내가그리는인생 2025. 6. 1. 16:07
반응형

MSSQL에서 자주 발생하는 문자열 처리 문제를 해결하는 실전 가이드. 공백 제거, 문자열 자르기, 줄바꿈 및 특수문자 제거까지 실무 예제로 완전 정복!

MSSQL 문자열 처리 심화 가이드

MSSQL을 활용한 데이터 처리 업무에서 문자열 정제는 필수입니다. 특히 불필요한 공백, 특수문자, 줄바꿈 문자, 문자열 자르기 등은 데이터를 정확히 처리하고 분석하기 위한 선행 작업입니다. 이 글에서는 MSSQL의 주요 문자열 함수들을 이용해 자주 겪는 문제를 해결하는 실전 예제를 제공합니다.


🔍 1. 공백 문자 제거 (일반 공백, 특수 공백, 양쪽 공백)

공백은 사용자가 인지하지 못한 상태에서 입력되는 경우가 많고, 데이터 정합성 확인 시 문제를 일으킬 수 있습니다. 특히 원본 데이터와 가공된 데이터가 같다고 판단했지만 실제로는 보이지 않는 공백 문자로 인해 다르게 인식되는 경우가 있습니다. 따라서 비교 시 양쪽 데이터를 모두 공백 제거한 상태에서 비교하는 것이 중요합니다.

TRIM(), LTRIM(), RTRIM() 사용

SELECT TRIM(CustomerName) FROM Customers;
SELECT LTRIM('   ABC') AS LeftTrim;
SELECT RTRIM('XYZ   ') AS RightTrim;

✅ 원본 vs. 가공 데이터 비교 시 공백 제거 예시

실무에서는 원본 데이터 테이블과 가공된 데이터 테이블이 별도로 존재하는 경우가 많으며, 공백이나 특수문자 등의 사소한 차이로 인해 데이터 일치 검증에 오류가 발생하기도 합니다. 따라서 비교 전에는 양쪽 데이터 모두에서 공백을 제거한 후 비교하는 것이 안전합니다.

아래는 RawUserData(원본 테이블)와 CleanUserData(가공 테이블)에서 사용자 이름의 정합성을 비교하는 예제입니다.

-- 공백 제거 후 비교용 결과 테이블 생성 예시
SELECT
  r.UserID,
  r.UserName AS OriginalName,
  c.UserName AS CleanedName,
  TRIM(REPLACE(REPLACE(REPLACE(r.UserName, CHAR(160), ''), CHAR(10), ''), CHAR(13), '')) AS TrimmedOriginal,
  TRIM(REPLACE(REPLACE(REPLACE(c.UserName, CHAR(160), ''), CHAR(10), ''), CHAR(13), '')) AS TrimmedCleaned,
  CASE
    WHEN TRIM(REPLACE(REPLACE(REPLACE(r.UserName, CHAR(160), ''), CHAR(10), ''), CHAR(13), '')) =
         TRIM(REPLACE(REPLACE(REPLACE(c.UserName, CHAR(160), ''), CHAR(10), ''), CHAR(13), ''))
    THEN '일치'
    ELSE '불일치'
  END AS 비교결과
INTO Compare_UserNameTrim
FROM RawUserData r
JOIN CleanUserData c ON r.UserID = c.UserID;

이 쿼리는 공백, 줄바꿈 문자, 비표준 공백 등을 제거한 후 비교하여, 사용자 이름의 실질적 일치 여부를 확인합니다. 생성된 Compare_UserNameTrim 테이블은 이후 로그 검토, 수동 검증 또는 품질 리포트용으로도 활용할 수 있습니다.

또한 위 쿼리의 REPLACE 구조는 자주 사용되므로 뷰(View) 또는 공통 함수(UDF) 로 만들어두면 유지보수성이 높아집니다.

SELECT CASE WHEN TRIM(OriginalName) = TRIM(CleanedName) THEN '일치' ELSE '불일치' END AS 비교결과 FROM UserNames;

이렇게 공백을 제거한 후 비교하는 방식은 실무에서 **데이터 정합성 검증 및 중복 제거** 시 자주 사용됩니다.

#### ✅ 특수 공백 제거 (non-breaking space 등)
비정상 공백문자는 ASCII 160번 (`CHAR(160)`) 등으로 저장됩니다. 이를 일반 공백으로 바꾸거나 제거해야 합니다.
```sql
-- CHAR(160)을 공백으로 바꾼 후 TRIM
SELECT TRIM(REPLACE(Name, CHAR(160), '')) FROM Customers;

SMALL

✂️ 2. 문자열 자르기 (LEFT, RIGHT, SUBSTRING)

LEFT() / RIGHT() 예제

SELECT LEFT(ProductCode, 3) AS Category FROM Products;
SELECT RIGHT(ProductCode, 4) AS ItemCode FROM Products;

SUBSTRING()으로 중간 값 추출

SELECT SUBSTRING(PhoneNumber, 5, 4) AS MiddleDigits FROM Users;

✅ 동적 위치 기반 추출 (CHARINDEX 활용)

SELECT SUBSTRING(Email, 1, CHARINDEX('@', Email) - 1) AS Username
FROM Users;

🚫 3. 특수문자 및 줄바꿈 제거

REPLACE()로 줄바꿈 문자 제거

  • CHAR(10) : LF(Line Feed, \n)
  • CHAR(13) : CR(Carriage Return, \r)
SELECT REPLACE(REPLACE(Comment, CHAR(13), ''), CHAR(10), '') AS CleanedComment
FROM Feedback;

✅ 여러 특수문자 제거 (예: 탭, 특수기호)

-- 특수기호 제거: 예시는 하이픈과 탭 제거
SELECT REPLACE(REPLACE(Note, CHAR(9), ''), '-', '') FROM Memos;

PATINDEX()와 정규 패턴 응용 (SQL Server는 기본적으로 단순 패턴만 지원)

-- 패턴 위치 찾기: 특수문자 존재 여부 확인
SELECT PATINDEX('%[^a-zA-Z0-9 ]%', ColumnName) AS SpecialCharPos
FROM TableName;

🧪 실전 활용 예제: 사용자 입력 정제

시나리오: 사용자 입력된 이름에서 특수 공백, 줄바꿈, 특수기호 제거 + 양쪽 공백 제거

SELECT
  TRIM(REPLACE(REPLACE(REPLACE(UserName, CHAR(160), ''), CHAR(10), ''), CHAR(13), '')) AS CleanName
FROM UserInput;

✅ 마무리

문자열 정제는 단순한 작업 같지만, 데이터 품질과 분석 정확도를 좌우하는 핵심입니다. MSSQL에서는 TRIM, REPLACE, SUBSTRING, PATINDEX 등의 함수를 조합하여 복잡한 문자열 처리도 충분히 자동화할 수 있습니다.

예제는 예제일뿐 실제로 조합에 따라 다양한 처리가 가능한점 참고하시면됩니다.

반응형