REGEXP_COUNT

REGEXP_COUNT

문자열에서 패턴이 발생하는 횟수를 반환해요.

출처: Snowflake SQL Reference - REGEXP_COUNT

본문

구문

REGEXP_COUNT( <subject> ,
              <pattern>
                [ , <position>
                  [ , <parameters> ]
                ]
)

인자

필수:

선택:

  • 함수가 일치 항목을 검색하기 시작하는 문자열 시작부터의 문자 수예요. 값은 양의 정수여야 해요. 기본값: 1(일치 검색이 왼쪽 첫 번째 문자에서 시작).
  • 일치 항목을 검색할 때 사용할 파라미터를 지정하는 하나 이상의 문자 문자열이에요. 지원되는 값:
Parameter Description
c 대소문자 구분 일치
i 대소문자 구분 없는 일치
m 멀티라인 모드
e 하위 일치(submatch) 추출
s 싱글라인 모드, POSIX 와일드카드 문자 .가 \n과 일치

기본값: c

자세한 내용은 Specifying the parameters for the regular expression을 참고해요.

반환 값

NUMBER 타입의 값을 반환해요. 인자 중 하나라도 NULL이면 NULL을 반환해요.

사용상 주의사항

정규 표현식 함수의 일반 사용상 주의사항을 참고해요.

컬레이션 상세

2026_04 BCR 번들이 활성화되면 함수는 컬레이션 지정이 있는 인자를 받아들여요. 컬레이션은 패턴 일치에 영향을 주지 않아요. 일치는 parameters 인자에 i 플래그를 전달하지 않는 한 항상 대소문자를 구분해요.

예시

다음 예시는 단어 was의 발생 횟수를 세어요. \b 메타문자를 사용해 단어 경계를 나타낼 수 있어요. 다음 예시에서 일치는 문자열의 첫 번째 문자 w에서 시작해 마지막 문자 s에서 끝나므로, 문자열을 포함하는 단어(예: washing)와는 일치하지 않아요.

SELECT REGEXP_COUNT('It was the best of times, it was the worst of times',
                    '\\bwas\\b',
                    1) AS result;

+--------+
| RESULT |
|--------|
|      2 |
+--------+

다음 예시는 문자 e의 대소문자 구분 없는 일치에 i 파라미터를 사용해요.

SELECT REGEXP_COUNT('Excelence', 'e', 1, 'i') AS e_in_excelence;

+----------------+
| E_IN_EXCELENCE |
|----------------|
|              4 |
+----------------+

다음 예시는 겹치는 발생(overlapping occurrences)을 보여줘요. 테이블을 만들고 데이터를 삽입해요.

CREATE OR REPLACE TABLE overlap (id NUMBER, a STRING);
INSERT INTO overlap VALUES (1,',abc,def,ghi,jkl,');
INSERT INTO overlap VALUES (2,',abc,,def,,ghi,,jkl,');

SELECT * FROM overlap;

+----+----------------------+
| ID | A                    |
|----+----------------------|
|  1 | ,abc,def,ghi,jkl,    |
|  2 | ,abc,,def,,ghi,,jkl, |
+----+----------------------+

각 행에서 다음 패턴이 발견된 횟수를 세는 REGEXP_COUNT를 사용하는 쿼리를 실행해요: 구두점 문자 + 숫자와 문자 + 구두점 문자.

SELECT id,
       REGEXP_COUNT(a,
                    '[[:punct:]][[:alnum:]]+[[:punct:]]',
                    1,
                    'i') AS result
  FROM overlap;

+----+--------+
| ID | RESULT |
|----+--------|
|  1 |      2 |
|  2 |      4 |
+----+--------+

나머지 예시들은 다음 테이블의 데이터를 사용해요.

CREATE OR REPLACE TABLE regexp_count_demo (dt DATE, messages VARCHAR);

INSERT INTO regexp_count_demo (dt, messages) VALUES
  ('10-AUG-2025','ER-6842,LG-230,LG-150,ER-3379,ER-6210'),
  ('11-AUG-2025','LG-272,LG-605,LG-683,ER-5577'),
  ('12-AUG-2025','ER-2207,LG-551,LG-826,ER-6842');

SELECT * FROM regexp_count_demo;

+------------+---------------------------------------+
| DT         | MESSAGES                              |
|------------+---------------------------------------|
| 2025-08-10 | ER-6842,LG-230,LG-150,ER-3379,ER-6210 |
| 2025-08-11 | LG-272,LG-605,LG-683,ER-5577          |
| 2025-08-12 | ER-2207,LG-551,LG-826,ER-6842         |
+------------+---------------------------------------+

다음 쿼리는 구분 기호(,)를 검색하고 1을 더해 각 날짜의 총 메시지 수를 반환해요.

SELECT dt,
       REGEXP_COUNT(messages, ',') + 1 AS message_count
  FROM regexp_count_demo;

+------------+---------------+
| DT         | MESSAGE_COUNT |
|------------+---------------|
| 2025-08-10 |             5 |
| 2025-08-11 |             4 |
| 2025-08-12 |             4 |
+------------+---------------+

오류가 항상 ER 다음에 하이픈과 네 자리 숫자가 오는 형태로 시작한다고 가정해요. 다음 쿼리는 각 날짜의 오류 수를 세어요.

SELECT dt,
       REGEXP_COUNT(messages, '\\bER-[0-9]{4}') AS number_of_errors
  FROM regexp_count_demo;

+------------+------------------+
| DT         | NUMBER_OF_ERRORS |
|------------+------------------|
| 2025-08-10 |                3 |
| 2025-08-11 |                1 |
| 2025-08-12 |                2 |
+------------+------------------+

더 알아보기