공공부하자개발 · 영어 학습 노트
SQL
SQL 고급분석 함수·계층·피벗·집계 확장0/10 완료
  • 01순위 분석 함수
  • 02집계 분석 함수와 윈도 프레임
  • 03행 비교 분석 함수
  • 04계층 쿼리: CONNECT BY 와 재귀 CTE
  • 05행과 열 바꾸기
  • 06소계와 총계
  • 07WITH 절(CTE)로 쿼리 구조화
  • 08MERGE 와 UPSERT
  • 09정규식 함수
  • 10다른 테이블 기준으로 수정·삭제
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › SQL 고급 › 09 / 10

정규식 함수

REGEXP_LIKE, REGEXP_SUBSTR, REGEXP_REPLACE, REGEXP_INSTR
섹션 6진행 0 / 10
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6정리‹ 이전다음 ›

3. 코드 예제

소스: sql-src/adv_09_regex/01_regexp_like.sql. 가상의 연락처 테이블 contact(이름, 전화, 이메일, 메모)에 일부러 잘못된 값을 섞었습니다. 하이픈 유무, 공백 구분, 자리 수 오류, @ 두 개, NULL 이 들어 있습니다.

예제 1: 데이터

전체 9행입니다.

text
ID | NAME   | PHONE         | EMAIL
---+--------+---------------+------------------
1  | 김하나 | 010-1234-5678 | [email protected]
2  | 이둘   | 01012345678   | [email protected]
3  | 박셋   | 010-123-4567  | [email protected]
4  | 최넷   | 02-345-6789   | [email protected]
5  | 정다섯 | 010-12345-678 | five@example
6  | 한여섯 | 010 9876 5432 | six@@example.com
7  | 오일곱 | 010-5555-6666 | [email protected]
8  | 윤여덟 | NULL          | [email protected]
9  | 강아홉 | abc-defg-hijk | nine.example.com
(9행)

예제 2: 전화번호 형식 검증

010 계열 번호로, 하이픈은 있어도 없어도 되고, 가운데 3~4자리, 끝 4자리인 행만 고릅니다.

sql
SELECT
       id
     , name
     , phone
  FROM contact
 WHERE REGEXP_LIKE(phone, '^01[016789]-?[0-9]{3,4}-?[0-9]{4}
  

)
 ORDER BY id;
text
ID | NAME   | PHONE
---+--------+--------------
1  | 김하나 | 010-1234-5678
2  | 이둘   | 01012345678
3  | 박셋   | 010-123-4567
7  | 오일곱 | 010-5555-6666
(4행)

01[016789] 는 010, 011, 016, 017, 018, 019 중 하나입니다. -? 가 하이픈을 있어도 없어도 되게 합니다. 4번 행(02-345-6789)은 지역 번호라 빠지고, 5번 행은 가운데가 5자리라 빠집니다.

예제 3: 틀린 행 찾기와 NULL

반대로 형식이 틀린 행을 찾을 때 NOT REGEXP_LIKE 만 쓰면 NULL 행이 빠집니다. 8번 행의 전화가 NULL 이라 조건이 참도 거짓도 아니기 때문입니다.

sql
SELECT
       id
     , name
     , phone
  FROM contact
 WHERE NOT REGEXP_LIKE(phone, '^01[016789]-?[0-9]{3,4}-?[0-9]{4}
  

)
 ORDER BY id;
text
ID | NAME   | PHONE
---+--------+--------------
4  | 최넷   | 02-345-6789
5  | 정다섯 | 010-12345-678
6  | 한여섯 | 010 9876 5432
9  | 강아홉 | abc-defg-hijk
(4행)

NULL 도 "번호가 없는 행" 으로 잡으려면 IS NULL 을 함께 씁니다(중급 06 NULL 처리 함수).

WHERE phone IS NULL OR NOT REGEXP_LIKE(...) 로 쓰면 위 4행에 8번 행이 더해져 5행이 됩니다. 실행 결과는 sql 파일에서 확인합니다.

예제 4: 이메일 형식과 LIKE 와의 차이

이메일은 @ 하나, 앞부분 문자 집합, 뒤에 점으로 이어진 도메인이 있어야 합니다. 점은 특별한 기호라 \. 로 적습니다.

sql
SELECT
       id
     , email
     , REGEXP_LIKE(email, '^[A-Za-z0-9._-]+@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)+
  

) AS ok
  FROM contact
 ORDER BY id;

1·2·3·4·7·8번 행만 true 이고 5번(도메인에 점 없음), 6번(@ 두 개), 9번(@ 없음)은 false 입니다. 4번 행은 대문자여도 문자 집합에 A-Z 가 있어 통과합니다.

LIKE 로는 이 조건을 만들 수 없습니다. 자리 수는 _ 로 고정할 수 있어도 그 자리가 숫자인지는 검사하지 못하기 때문입니다.

sql
SELECT
       id
     , phone
     , phone LIKE '___-____-____' AS by_like
     , REGEXP_LIKE(phone, '^[0-9]{3}-[0-9]{4}-[0-9]{4}
  

) AS by_regexp
  FROM contact
 WHERE id IN (1, 2, 7, 9)
 ORDER BY id;
text
ID | PHONE         | BY_LIKE | BY_REGEXP
---+---------------+---------+----------
1  | 010-1234-5678 | true    | true
2  | 01012345678   | false   | false
7  | 010-5555-6666 | true    | true
9  | abc-defg-hijk | true    | false
(4행)

9번 행 abc-defg-hijk 는 글자 수와 하이픈 위치가 맞아 LIKE 를 통과하지만, 정규식은 숫자가 아니라서 거릅니다.

예제 5: 대소문자 무시 옵션 'i'

옵션 없이는 대소문자를 구분합니다. 1번 행의 ORD 는 소문자 패턴에 맞지 않고, 4번 행의 ord 는 맞습니다. 'i' 를 주면 둘 다 맞습니다. 8번 행은 메모가 NULL 이라 결과도 NULL 입니다.

sql
SELECT
       id
     , memo
     , REGEXP_LIKE(memo, 'ord-2024') AS plain
     , REGEXP_LIKE(memo, 'ord-2024', 'i') AS ignore_case
  FROM contact
 WHERE id IN (1, 4, 8)
 ORDER BY id;
text
ID | MEMO                      | PLAIN | IGNORE_CASE
---+---------------------------+-------+------------
1  | 주문 ORD-2024-0015 문의   | false | true
4  | ord-2024-0040 소문자 표기 | true  | true
8  | NULL                      | NULL  | NULL
(3행)

예제 직접 실행

아래 폴더의 SQL 파일을 Git Bash 에서 H2 메모리 DB 로 실행합니다. 방언은 파일 안의 SET MODE 로 바꿉니다.

cd sql-src/adv_09_regex
ls *.sql
bash ../run.sh <파일>.sql
코드 예제
  • 예제 1: 데이터
  • 예제 2: 전화번호 형식 검증
  • 예제 3: 틀린 행 찾기와 NULL
  • 예제 4: 이메일 형식과 LIKE 와의 차이
  • 예제 5: 대소문자 무시 옵션 'i'
이전 섹션2 핵심 원리3 / 6다음 섹션4 응용 변형 예제