SUBSTR, SUBSTRING
SUBSTR, SUBSTRING
SUBSTR 함수는 base_expr에서 start_expr로 지정된 문자/바이트부터 시작해, 선택적으로 길이를 제한한 문자열 또는 이진 값의 일부를 반환해요.
본문
SUBSTR 함수는 base_expr에서 start_expr로 지정된 문자/바이트부터 시작해, 선택적으로 길이를 제한한 문자열 또는 이진 값의 일부를 반환해요.
이 함수들은 동의어(synonymous)예요.
함께 보기: LEFT, RIGHT
구문 (Syntax)
SUBSTR( <base_expr>, <start_expr> [ , <length_expr> ] )
SUBSTRING( <base_expr>, <start_expr> [ , <length_expr> ] )
인자 (Arguments)
- base_expr —
VARCHAR또는BINARY값으로 평가되는 표현식이에요. - start_expr — 정수로 평가되는 표현식이에요. 부분 문자열이 시작되는 오프셋을 지정해요. 오프셋은 다음 단위로 측정돼요: 입력이
VARCHAR값이면 UTF-8 문자의 수, 입력이BINARY값이면 바이트의 수. 시작 위치는 0 기반이 아닌 1 기반이에요. 예를 들어SUBSTR('abc', 1, 1)은 b가 아닌 a를 반환해요. - length_expr — 정수로 평가되는 표현식이에요. 다음을 지정해요: 입력이
VARCHAR이면 반환할 UTF-8 문자의 수, 입력이BINARY이면 반환할 바이트의 수. 0보다 크거나 같은 길이를 지정해요. 길이가 음수이면 함수는 빈 문자열을 반환해요.
반환 (Returns)
반환 값의 데이터 타입은 base_expr의 데이터 타입(VARCHAR 또는 BINARY)과 동일해요.
입력 중 하나라도 NULL이면 NULL이 반환돼요.
사용 메모 (Usage notes)
length_expr를 지정하면 최대length_expr문자/바이트가 반환돼요.length_expr를 지정하지 않으면 문자열 또는 이진 값의 끝까지 모든 문자를 반환해요.start_expr의 값은 1부터 시작해요: 0을 지정하면 1로 처리돼요. 음수 값을 지정하면 시작 위치는 문자열 또는 이진 값의 끝에서start_expr문자/바이트로 계산돼요. 위치가 문자열 또는 이진 값의 범위 밖이면 빈 값이 반환돼요.
정렬 규칙 세부 사항 (Collation details)
- 정렬 규칙은
VARCHAR입력에 적용돼요. 첫 번째 매개변수의 입력 데이터 타입이BINARY이면 정렬 규칙이 적용되지 않아요. - 영향 없음. 정렬 규칙이 구문상 허용되지만 처리에는 영향을 주지 않아요. 예를 들어 여러 언어의 두 문자 및 세 문자 문자(헝가리어의 "dzs"나 체코어의 "ch" 등)는 길이 인자에 대해 여전히 두 개 또는 세 개의 문자(한 문자 아님)로 계산돼요.
- 결과의 정렬 규칙은 입력의 정렬 규칙과 동일해요. 이는 반환된 값을 중첩 함수 호출의 일부로 다른 함수에 전달할 때 유용할 수 있어요.
예제 (Examples)
다음 예제는 SUBSTR 함수를 사용해요.
기본 예제
9번째 문자부터 시작해 반환 값의 길이를 세 문자로 제한한 문자열의 일부를 반환해요:
SELECT SUBSTR('testing 1 2 3', 9, 3);
+-------------------------------+
| SUBSTR('TESTING 1 2 3', 9, 3) |
|-------------------------------|
| 1 2 |
+-------------------------------+
다른 시작 및 길이 값 지정
같은 base_expr에 start_expr와 length_expr의 다른 값을 지정했을 때 반환되는 부분 문자열을 보여줘요:
CREATE OR REPLACE TABLE test_substr (
base_value VARCHAR,
start_value INT,
length_value INT)
AS SELECT
column1,
column2,
column3
FROM
VALUES
('mystring', -1, 3),
('mystring', -3, 3),
('mystring', -3, 7),
('mystring', -5, 3),
('mystring', -7, 3),
('mystring', 0, 3),
('mystring', 0, 7),
('mystring', 1, 3),
('mystring', 1, 7),
('mystring', 3, 3),
('mystring', 3, 7),
('mystring', 5, 3),
('mystring', 5, 7),
('mystring', 7, 3),
('mystring', NULL, 3),
('mystring', 3, NULL);
SELECT base_value,
start_value,
length_value,
SUBSTR(base_value, start_value, length_value) AS substring
FROM test_substr;
+------------+-------------+--------------+-----------+
| BASE_VALUE | START_VALUE | LENGTH_VALUE | SUBSTRING |
|------------+-------------+--------------+-----------|
| mystring | -1 | 3 | g |
| mystring | -3 | 3 | ing |
| mystring | -3 | 7 | ing |
| mystring | -5 | 3 | tri |
| mystring | -7 | 3 | yst |
| mystring | 0 | 3 | mys |
| mystring | 0 | 7 | mystrin |
| mystring | 1 | 3 | mys |
| mystring | 1 | 7 | mystrin |
| mystring | 3 | 3 | str |
| mystring | 3 | 7 | string |
| mystring | 5 | 3 | rin |
| mystring | 5 | 7 | ring |
| mystring | 7 | 3 | ng |
| mystring | NULL | 3 | NULL |
| mystring | 3 | NULL | NULL |
+------------+-------------+--------------+-----------+
이메일, 전화, 날짜 문자열의 부분 문자열 반환
POSITION 함수를 SUBSTR 함수와 함께 사용해 이메일 주소에서 도메인을 추출해요. 이 예제는 각 문자열에서 @의 위치를 찾고 1을 더해 다음 문자에서 시작해요:
SELECT cust_id,
cust_email,
SUBSTR(cust_email, POSITION('@' IN cust_email) + 1) AS domain
FROM customer_contact_example;
+---------+---------------------------------+-------------+
| CUST_ID | CUST_EMAIL | DOMAIN |
|---------+---------------------------------+-------------|
| 1 | [email protected] | example.com |
| 2 | [email protected] | example.org |
| 3 | [email protected] | example.net |
+---------+---------------------------------+-------------+
cust_phone 열에서 지역 번호는 항상 처음 세 문자예요. 전화번호에서 지역 번호를 추출해요:
SELECT cust_id,
cust_phone,
SUBSTR(cust_phone, 1, 3) AS area_code
FROM customer_contact_example;
+---------+--------------+-----------+
| CUST_ID | CUST_PHONE | AREA_CODE |
|---------+--------------+-----------|
| 1 | 800-555-0100 | 800 |
| 2 | 800-555-0101 | 800 |
| 3 | 800-555-0102 | 800 |
+---------+--------------+-----------+
전화번호에서 지역 번호를 제거해요:
SELECT cust_id,
cust_phone,
SUBSTR(cust_phone, 5) AS phone_without_area_code
FROM customer_contact_example;
+---------+--------------+-------------------------+
| CUST_ID | CUST_PHONE | PHONE_WITHOUT_AREA_CODE |
|---------+--------------+-------------------------|
| 1 | 800-555-0100 | 555-0100 |
| 2 | 800-555-0101 | 555-0101 |
| 3 | 800-555-0102 | 555-0102 |
+---------+--------------+-------------------------+
activation_date 열의 날짜는 항상 YYYYMMDD 형식이에요. 이 문자열들에서 연, 월, 일을 추출해요:
SELECT cust_id,
activation_date,
SUBSTR(activation_date, 1, 4) AS year,
SUBSTR(activation_date, 5, 2) AS month,
SUBSTR(activation_date, 7, 2) AS day
FROM customer_contact_example;
+---------+-----------------+------+-------+-----+
| CUST_ID | ACTIVATION_DATE | YEAR | MONTH | DAY |
|---------+-----------------+------+-------+-----|
| 1 | 20210320 | 2021 | 03 | 20 |
| 2 | 20240509 | 2024 | 05 | 09 |
| 3 | 20191017 | 2019 | 10 | 17 |
+---------+-----------------+------+-------+-----+
더 알아보기 (Learn more)
- SUBSTRING
- LEFT, RIGHT
- 문자열 및 이진 함수 (String & binary functions)
- 매칭/비교 함수 (Matching/Comparison)