SUBSTR, SUBSTRING

SUBSTR, SUBSTRING

SUBSTR 함수는 base_expr에서 start_expr로 지정된 문자/바이트부터 시작해, 선택적으로 길이를 제한한 문자열 또는 이진 값의 일부를 반환해요.

출처: SUBSTR, SUBSTRING

본문

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)