데이터 처리 도구/SQL

[MySQL] 정규표현식 함수 (Regular Expressions)

yourhm 2024. 7. 11. 13:16

MySQL 공식문서 (https://dev.mysql.com/doc/refman/8.4/en/regexp.html)

 

 

 

문자열과 정규표현식 패턴의 일치 여부를 알려주는 함수

방법 1. REGEXP (= RLIKE)

-- synonyms: REGEXP = RLIKE

SELECT expr REGEXP pat;
SELECT expr RLIKE pat;     

SELECT expr NOT REGEXP pat;
SELECT expr NOT RLIKE pat;

문자열(expr)이 정규표현식 패턴(pat)과 일치하면 ⇒ 1

문자열(expr)이 정규표현식 패턴(pat)과 일치하지 않으면 0

문자열(expr) 또는 정규표현식 패턴(pat)가 NULL 인 경우 ⇒ NULL

 

 

방법 2. REGEXP_LIKE( )

SELECT REGEXP_LIKE(expr, pat[, match_type]);

문자열(expr)이 정규표현식 패턴(pat)과 일치하면 ⇒ 1

문자열(expr)이 정규표현식 패턴(pat)과 일치하지 않으면  0

문자열(expr) 또는 정규표현식 패턴(pat)가 NULL 인 경우 ⇒ NULL

 

▶ match_type (optional)

c: Case-sensitive matching.
i: Case-insensitive matching.
m: Multiple-line mode. Recognize line terminators within the string. The default behavior is to match line terminators only at the start and end of the string expression.
n: The ' . ' character matches line terminators. The default is for ' . ' matching to stop at the end of a line.
u: Unix-only line endings. Only the newline character is recognized as a line ending by the ' . ' , ' ^ ' , and ' $ ' match operators.

 

 

 

[예시]

테이블: car_rental_company

car_id car_type options
1 sedan 열선시트,가죽시트,후방카메라
2 suv 스마트키,네비게이션,통풍시트
3 suv 주차감지센서,후방카메라
4 hatchback 주차감지센서,네비게이션,가죽시트
5 suv 네비게이션,열선시트,가죽시트,후방카메라

 

Q. '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 차량이 종류별로 몇 대인지 구하기

-- (1) REGEXP 사용해서 구하기
SELECT car_type
     , COUNT(car_id) AS cars
FROM car_rental_company
WHERE options REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY car_type
ORDER BY car_type ASC;


-- (2) REGEXP_LIKE() 사용해서 구하기
SELECT car_type
     , COUNT(car_id) AS cars
FROM car_rental_company
WHERE REGEXP_LIKE(options, '통풍시트|열선시트|가죽시트')
GROUP BY car_type
ORDER BY car_type ASC;
car_type cars
hatchback 1
sedan 1
suv 2

 

 

 

 

문자열에서 정규표현식 패턴과 일치하는 부분만 추출하는 함수

REGEXP_SUBSTR( )

SELECT REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])

- 문자열(expr)에서 정규표현식 패턴(pat)와 일치하는 부분만 추출한다. 일치하는 부분이 없다면 NULL을 반환한다.

- 문자열(expr) 또는 정규표현식 패턴(pat)가 NULL 인 경우 ⇒ NULL을 반환한다.

 

 

 

문자열에서 정규표현식 패턴과 일치하는 부분을 변환하는 함수

REGEXP_REPLACE( )

SELECT REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]]);

- 문자열에서 정규표현식 패턴과 일치하는 부분을 대체 문자열로 변환한 뒤, 변환이 적용된 결과 문자열을 반환한다.

- 문자열(expr), 정규표현식 패턴(pat), 대체할 문자열(rep1) 중 하나라도 NULL 인 경우 ⇒ NULL을 반환한다.

 

 

 

문자열에서 정규표현식 패턴과 일치하는 부분의 인덱스를 알려주는 함수

REGEXP_INSTR( )

SELECT REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])

- 문자열에서 정규표현식 패턴과 일치하는 부분이 몇 번째 인덱스에서 시작하는지 알려준다. 일치하는 부분이 없다면 0을 반환한다. (Character indexes는 1에서 시작한다.)

- 문자열(expr) 또는 정규표현식 패턴(pat)가 NULL 인 경우  NULL을 반환한다.

 

 

 

[참고자료]

MySQL Documentation > 14.8.2 Regular Expressions

https://dev.mysql.com/doc/refman/8.4/en/regexp.html