DB/postgreSQL

PostgreSQL 문자열 자르기

devmean 2026. 3. 27. 14:39

1. SUBSTRING 함수 

가장 범용적으로 사용되는 함수입니다.

기본 문법

SUBSTRING(문자열 FROM 시작위치 FOR 길이)

예제

SELECT SUBSTRING('Hello World' FROM 1 FOR 5);

결과: Hello

특징

  • 시작 위치는 1부터 시작
  • 길이를 생략하면 끝까지 반환
SELECT SUBSTRING('Hello World' FROM 7);

결과: World


2. LEFT / RIGHT 함수 (간단한 자르기)

문자열의 양 끝에서 자를 때 유용합니다.

LEFT

SELECT LEFT('Hello World', 5);

결과: Hello

RIGHT

SELECT RIGHT('Hello World', 5);

결과: World

특징

  • 문법이 간단하고 가독성이 좋음
  • 단순 길이 기반 자르기에 적합

3. SPLIT_PART 함수

특정 구분자를 기준으로 문자열을 나눌 때 사용합니다.

기본 문법

SPLIT_PART(문자열, 구분자, 위치)

예제

SELECT SPLIT_PART('apple,banana,grape', ',', 2);

결과: banana

특징

  • CSV, 로그, 이메일 처리에 유용
  • 위치는 1부터 시작

4. POSITION + SUBSTRING 

특정 문자의 위치를 기준으로 자를 수 있습니다.

예제 (이메일 아이디 추출)

SELECT SUBSTRING('test@example.com'
FROM 1 FOR POSITION('@' IN 'test@example.com') - 1);

결과: test


5. 정규식 기반 문자열 자르기

패턴 기반 추출이 필요한 경우 사용합니다.

예제

SELECT SUBSTRING('abc123xyz' FROM '[0-9]+');

결과: 123

특징

  • 복잡한 문자열 처리 가능
  • 정규식 비용이 높아 성능 주의 필요

성능 관점에서의 차이

문자열 함수는 단순해 보이지만 대량 데이터에서는 성능 차이가 발생합니다.

1. 함수 비용 비교

일반적인 성능 순서는 다음과 같습니다.

  • 빠름: LEFT, RIGHT
  • 보통: SUBSTRING
  • 상황에 따라: SPLIT_PART
  • 느림: 정규식 기반 SUBSTRING

이유:

  • LEFT, RIGHT는 단순 길이 기반 연산
  • SUBSTRING은 범용 함수로 약간 더 많은 처리 필요
  • 정규식은 패턴 매칭 엔진을 사용하기 때문에 비용이 큼

2. WHERE 절에서의 성능 문제

다음과 같은 쿼리는 인덱스를 사용할 수 없습니다.

SELECT * 
FROM users
WHERE SUBSTRING(email FROM 1 FOR 4) = 'test';
  • 컬럼에 함수가 적용되면 인덱스가 무효화됨

3. 해결 방법 (인덱스 활용)

방법 1: LIKE 사용

SELECT * 
FROM users
WHERE email LIKE 'test%';
  • 인덱스 사용 가능 (prefix 검색)

방법 2: 함수 기반 인덱스

CREATE INDEX idx_users_email_prefix
ON users (SUBSTRING(email FROM 1 FOR 4));

 

SELECT *
FROM users
WHERE SUBSTRING(email FROM 1 FOR 4) = 'test';
  • 인덱스 사용 가능

4. SPLIT_PART 성능 주의

SELECT SPLIT_PART(email, '@', 1) FROM users;
  • 전체 데이터를 매번 split 하기 때문에 비용 증가
  • 대량 데이터에서는 미리 컬럼 분리 권장

5. 정규식 사용 시 주의

SELECT SUBSTRING(col FROM '[0-9]+') FROM table;
  • Full scan + regex 처리로 매우 느려질 수 있음
  • 가능한 경우 일반 함수로 대체
반응형

'DB > postgreSQL' 카테고리의 다른 글

postgreSQL UPDATE, DELETE 조인 사용법  (0) 2025.04.01
postgreSQL merge문 사용하기  (0) 2025.03.28
postgreSQL 임시테이블 생성  (0) 2025.03.28