문자열 치환 함수
문자열 치환 함수 (String Functions for Replacing/Overlaying)
문자열의 특정 부분을 다른 문자열로 치환·교체·변환하는 함수들이에요. 일반 치환(replaceAll, replaceOne), 정규식을 이용한 치환(replaceRegexpAll, replaceRegexpOne), 자리표시자 기반 포맷팅(format, printf), 문자 단위 매핑(translate) 등을 제공해요. 일반 문자열 함수나 문자열 검색 함수는 각각 별도 문서에서 다루어요.
출처: 문서
본문
참고: 아래 문서는
system.functions시스템 테이블에서 생성된 것이에요.
format
도입: v20.1.0
pattern 문자열을 인자에 나열된 값(문자열, 정수 등)들로 포맷팅해요. Python의 포맷팅과 비슷해요. 패턴 문자열에는 중괄호 {}로 감싼 치환 필드(replacement field)를 쓸 수 있어요. 중괄호 안에 있지 않은 모든 내용은 리터럴 텍스트로 취급되어 그대로 출력에 복사돼요. 리터럴 중괄호는 {{, }}처럼 두 개로 이스케이프할 수 있어요. 필드 이름은 (0부터 시작하는) 숫자이거나 비어 있을 수 있는데, 비어 있으면 0부터 1씩 증가하는 번호가 자동으로 매겨져요.
구문 (Syntax)
format(pattern, s0[, s1, ...])
인자 (Arguments)
pattern— 자리표시자를 담은 포맷 문자열.Strings0[, s1, ...]— 패턴에 치환할 값 하나 이상.Any
반환 값 (Returned value)
포맷된 문자열을 반환해요. String
예시 (Examples)
번호가 매겨진 자리표시자
SELECT format('{1} {0} {1}', 'World', 'Hello')
┌─format('{1} {0} {1}', 'World', 'Hello')─┐
│ Hello World Hello │
└─────────────────────────────────────────┘
암묵적 번호 매기기
SELECT format('{} {}', 'Hello', 'World')
┌─format('{} {}', 'Hello', 'World')─┐
│ Hello World │
└───────────────────────────────────┘
overlay
도입: v24.9.0
1부터 시작하는 인덱스 offset부터 input 문자열의 일부를 다른 문자열 replace로 치환해요.
구문 (Syntax)
overlay(s, replace, offset[, length])
인자 (Arguments)
s— 입력 문자열.Stringreplace— 치환 문자열.const Stringoffset— 정수 타입(1부터 시작).offset이 음수면 문자열s의 끝에서부터 센 위치예요.Intlength— 선택 사항. 정수 타입Int.length는 입력 문자열s안에서 치환할 조각의 길이를 지정해요.length를 지정하지 않으면s에서 제거되는 바이트 수가replace의 길이와 같아지고, 지정하면length개의 바이트가 제거돼요.Int
반환 값 (Returned value)
치환이 적용된 문자열을 반환해요. String
예시 (Examples)
기본 치환
SELECT overlay('My father is from Mexico.', 'mother', 4) AS res;
┌─res───────────────────────┐
│ My mother is from Mexico. │
└───────────────────────────┘
길이를 지정한 치환
SELECT overlay('My father is from Mexico.', 'dad', 4, 6) AS res;
┌─res────────────────────┐
│ My dad is from Mexico. │
└────────────────────────┘
overlayUTF8
도입: v24.9.0
1부터 시작하는 인덱스 offset부터 문자열 s의 일부를 다른 문자열 replace로 치환해요. 문자열이 올바른 UTF-8 인코딩 텍스트라고 가정해요. 이 가정이 어긋나면 예외를 던지지 않고 결과는 정의되지 않아요.
구문 (Syntax)
overlayUTF8(s, replace, offset[, length])
인자 (Arguments)
s— 입력 문자열.Stringreplace— 치환 문자열.const Stringoffset— 정수 타입(1부터 시작).offset이 음수면 입력 문자열s의 끝에서부터 센 위치예요.(U)Int*length— 선택 사항. 입력 문자열s안에서 치환할 조각의 길이를 지정해요.length를 지정하지 않으면s에서 제거되는 문자 수가replace의 길이와 같아지고, 지정하면length개의 문자가 제거돼요.(U)Int*
반환 값 (Returned value)
치환이 적용된 문자열을 반환해요. String
예시 (Examples)
UTF-8 치환
SELECT overlayUTF8('Mein Vater ist aus Österreich.', 'der Türkei', 20) AS res;
┌─res────────────────────────────┐
│ Mein Vater ist aus der Türkei. │
└────────────────────────────────┘
printf
도입: v24.8.0
printf 함수는 주어진 문자열을 인자에 나열된 값(문자열, 정수, 부동소수점 등)들로 포맷팅해요. C++의 printf 함수와 비슷해요. 포맷 문자열에는 % 문자로 시작하는 포맷 지정자(format specifier)를 쓸 수 있어요. %와 그 뒤 포맷 지정자에 해당하지 않는 모든 내용은 리터럴 텍스트로 취급되어 출력에 그대로 복사돼요. 리터럴 %는 %%로 이스케이프해요. 포맷 문자열은 상수일 수도 있고 컬럼 표현식일 수도 있어서, 행마다 다른 포맷 패턴을 쓸 수 있어요.
구문 (Syntax)
printf(format[, sub1, sub2, ...])
인자 (Arguments)
format—%지정자를 담은 포맷 문자열.Stringsub1, sub2, ...— 선택 사항. 포맷 문자열에 치환할 값 0개 이상.Any
반환 값 (Returned value)
포맷된 문자열을 반환해요. String
예시 (Examples)
C++ 스타일 포맷팅
SELECT printf('%%%s %s %d', 'Hello', 'World', 2024);
┌─printf('%%%s %s %d', 'Hello', 'World', 2024)─┐
│ %Hello World 2024 │
└──────────────────────────────────────────────┘
regexpQuoteMeta
도입: v20.1.0
정규식에서 특별한 의미를 갖는 다음 문자 앞에 백슬래시를 추가해요: \0, \\, |, (, ), ^, $, ., [, ], ?, *, +, {, :, -. 이 구현은 re2::RE2::QuoteMeta와 약간 달라요. 0 바이트를 \x00 대신 \0으로 이스케이프하고, 필요한 문자만 이스케이프해요.
구문 (Syntax)
regexpQuoteMeta(s)
인자 (Arguments)
s— 정규식용으로 이스케이프할 문자를 담은 입력 문자열.String
반환 값 (Returned value)
정규식 특수 문자가 이스케이프된 문자열을 반환해요. String
예시 (Examples)
정규식 특수 문자 이스케이프
SELECT regexpQuoteMeta('Hello. [World]? (Yes)*') AS res
┌─res───────────────────────────┐
│ Hello\. \[World\]\? \(Yes\)\* │
└───────────────────────────────┘
replaceAll
도입: v1.1.0
haystack 안의 부분 문자열 pattern이 나타나는 모든 위치를 replacement 문자열로 치환해요.
구문 (Syntax)
replaceAll(haystack, pattern, replacement)
별칭 (Aliases): replace
인자 (Arguments)
haystack— 검색할 입력 문자열.Stringpattern— 찾아서 치환할 부분 문자열.const Stringreplacement— 패턴 대신 사용할 문자열.const String
반환 값 (Returned value)
패턴의 모든 출현이 치환된 문자열을 반환해요. String
예시 (Examples)
모든 출현 치환
SELECT replaceAll('Hello, Hello world', 'Hello', 'Hi') AS res;
┌─res──────────┐
│ Hi, Hi world │
└──────────────┘
replaceOne
도입: v1.1.0
haystack 안의 부분 문자열 pattern이 처음 나타난 한 곳만 replacement 문자열로 치환해요.
구문 (Syntax)
replaceOne(haystack, pattern, replacement)
인자 (Arguments)
haystack— 검색할 입력 문자열.Stringpattern— 찾아서 치환할 부분 문자열.const Stringreplacement— 패턴 대신 사용할 문자열.const String
반환 값 (Returned value)
패턴의 첫 출현이 치환된 문자열을 반환해요. String
예시 (Examples)
첫 출현 치환
SELECT replaceOne('Hello, Hello world', 'Hello', 'Hi') AS res;
┌─res─────────────┐
│ Hi, Hello world │
└─────────────────┘
replaceRegexpAll
도입: v1.1.0
replaceRegexpOne과 같지만 패턴의 모든 출현을 치환해요. 예외적으로, 정규식이 빈 부분 문자열에 대해 동작했다면 치환은 한 번만 수행돼요.
구문 (Syntax)
replaceRegexpAll(haystack, pattern, replacement)
별칭 (Aliases): REGEXP_REPLACE
인자 (Arguments)
haystack— 검색할 입력 문자열.Stringpattern— 찾을 정규식 패턴.const Stringreplacement— 패턴 대신 사용할 문자열. 치환(substitution)을 담을 수 있어요.const String
반환 값 (Returned value)
모든 정규식 매치가 치환된 문자열을 반환해요. String
예시 (Examples)
모든 문자를 두 배로 늘린 버전으로 치환
SELECT replaceRegexpAll('Hello123', '.', '\\0\\0') AS res
┌─res──────────────┐
│ HHeelllloo112233 │
└──────────────────┘
빈 부분 문자열 치환 예시
SELECT replaceRegexpAll('Hello, World!', '^', 'here: ') AS res
┌─res─────────────────┐
│ here: Hello, World! │
└─────────────────────┘
replaceRegexpOne
도입: v1.1.0
haystack 안에서 정규식 pattern(re2 구문)과 일치하는 부분 문자열이 처음 나타난 곳을 replacement 문자열로 치환해요. replacement에는 치환 \0-\9를 담을 수 있어요. \1-\9는 1번부터 9번째 캡처링 그룹(submatch)에 대응하고, \0는 전체 매치에 대응해요. pattern이나 replacement 문자열에 리터럴 \ 문자를 쓰려면 \로 이스케이프해요. 문자열 리터럴에는 추가 이스케이프가 필요함을 기억하세요.
구문 (Syntax)
replaceRegexpOne(haystack, pattern, replacement)
인자 (Arguments)
haystack— 검색할 입력 문자열.Stringpattern— 찾을 정규식 패턴.const Stringreplacement— 패턴 대신 사용할 문자열. 치환을 담을 수 있어요.const String
반환 값 (Returned value)
첫 정규식 매치가 치환된 문자열을 반환해요. String
예시 (Examples)
ISO 날짜를 미국식 형식으로 변환
SELECT replaceRegexpOne(d, '(\\d{4})-(\\d{2})-(\\d{2})', '\\2/\\3/\\1') AS res
FROM values('d String', '2014-03-17', '2014-03-18', '2014-03-19')
┌─res────────┐
│ 03/17/2014 │
│ 03/18/2014 │
│ 03/19/2014 │
└────────────┘
문자열을 열 번 복사
SELECT replaceRegexpOne('Hello, World!', '.*', '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0') AS res
┌─res────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World! │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
translate
도입: v22.7.0
from과 to 문자열이 정의한 일대일 문자 매핑을 이용해 문자열 s의 문자들을 치환해요. from과 to는 상수 ASCII 문자열이어야 해요. from과 to의 길이가 같으면, s 안에 나타나는 from의 첫 번째 문자는 to의 첫 번째 문자로, from의 두 번째 문자는 to의 두 번째 문자로 치환되는 식이에요. from이 to보다 문자가 많으면, to에 대응 문자가 없는 from 끝쪽 문자열의 모든 출현은 s에서 삭제돼요. s의 비-ASCII 문자는 이 함수로 수정되지 않아요.
구문 (Syntax)
translate(s, from, to)
인자 (Arguments)
s— 변환할 입력 문자열.Stringfrom— 치환할 문자를 담은 상수 ASCII 문자열.const Stringto— 치환 문자를 담은 상수 ASCII 문자열.const String
반환 값 (Returned value)
문자 변환이 적용된 문자열을 반환해요. String
예시 (Examples)
문자 매핑
SELECT translate('Hello, World!', 'delor', 'DELOR') AS res
┌─res───────────┐
│ HELLO, WORLD! │
└───────────────┘
서로 다른 길이
SELECT translate('clickhouse', 'clickhouse', 'CLICK') AS res
┌─res───┐
│ CLICK │
└───────┘
translateUTF8
도입: v22.7.0
translate와 같지만 s, from, to가 UTF-8 인코딩 문자열이라고 가정해요.
구문 (Syntax)
translateUTF8(s, from, to)
인자 (Arguments)
s— 변환할 UTF-8 입력 문자열.Stringfrom— 치환할 문자를 담은 상수 UTF-8 문자열.const Stringto— 치환 문자를 담은 상수 UTF-8 문자열.const String
반환 값 (Returned value)
String 데이터 타입 값을 반환해요. String
예시 (Examples)
UTF-8 문자 변환
SELECT translateUTF8('Münchener Straße', 'üß', 'us') AS res;
┌─res──────────────┐
│ Munchener Strase │
└──────────────────┘