REGEXP_COUNT
REGEXP_COUNT
문자열에서 패턴이 발생하는 횟수를 반환해요.
본문
구문
REGEXP_COUNT( <subject> ,
<pattern>
[ , <position>
[ , <parameters> ]
]
)
인자
필수:
- 일치 항목을 검색할 문자열이에요.
- 일치시킬 패턴이에요. 패턴 지정에 대한 지침은 String functions (regular expressions)를 참고해요.
선택:
- 함수가 일치 항목을 검색하기 시작하는 문자열 시작부터의 문자 수예요. 값은 양의 정수여야 해요. 기본값: 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 |
+------------+------------------+