[DB] 패턴 매칭(pattern matching)

calis_ws·2024년 2월 25일
0

= 연산자로 검색하는 경우 데이터의 값이 완전히 동일한지를 비교하게 된다.

하지만 특정 문자나 문자열이 포함되어 있는지를 검색하고 싶은 경우도 많을 것이다.

이런 경우 LIKE 를 사용하여 패턴 매칭으로 검색할 수 있다.

LIKE 로 패턴 매칭

LIKE 를 사용하면 열 값이 부분적으로 일치하는 경우에도 참이 된다.

// LIKE 조건식
열명 LIKE '패턴'

LIKE 는 이항 연산자처럼 왼쪽에 매칭 대상을 지정하고 오른쪽에는 패턴을 문자열로 지정한다. 단, 수치형 상수는 지정할 수 없다.

패턴을 정의할 때는 % 그리고 _와 같은 메타문자를 사용할 수 있다.

와일드 카드라고 불리는 메타문자는 패턴 매칭 시 임의의 문자 또는 문자열에 매치하는 부분을 지정하기 위해 쓰이는 특수 문자이다.

퍼센트%는 임의의 문자열을 의미하고 언더스코어_는 임의의 문자 하나를 의미한다.

메타문자가 없어도 조회는 가능하지만 이럴 경우 완전 일치로 검색되므로 LIKE 를 사용하는 의미가 없어진다.

SELECT * FROM sample25;

예제 테이블의 text 열에서 'SQL' 문자열을 포함하는 행을 패턴 매칭으로 검색해보자

SELECT * FROM sample25 WHERE (text LIKE 'SQL%');

분명 no 열이 3인 행도 SQL 문자열을 포함하는데 조회 결과에 포함되지 않은 이유가 무엇일까?

그 이유는 text 열의 데이터가 SQL 문자열로 시작하지 않았기 때문이다.
다시 말해 SQL 문자열 앞에도 문자열이 존재하므로 % 메타문자를 패턴 앞에도 붙여줘야 한다.

SELECT * FROM sample25 WHERE (text LIKE '%SQL%');

LIKE로 %를 검색하기

예제 테이블에서 no열이 2인 행의 text열 값을 보면 메타문자인 %와 _가 포함되어 있다.

만약 메타문자와 동일한 문자로 LIKE로 검색할 경우 어떻게 패턴을 정의해야 할까?

프로그래밍 언어에서는 이런 경우 대체로 이스케이프라는 방법으로 처리한다.

이스케이프 문자\를 메타문자 앞에 붙이면 메타문자도 패턴에 사용할 수 있다.

SELECT * FROM sample25 WHERE (text LIKE '%\%%');

문자열 상수 ' 의 이스케이프

메타문자는 이스케이프로 처리할 수 있음을 확인하였다.

그렇다면 패턴과 같이 문자열 상수 안에 '를 포함하고 싶다면 어떻게 해야 할까?

이때는 이스케이프 문자가 아니라 동일한 문자인 '를 앞에 한 번 더 붙여주면 된다.

WHERE (text LIKE 'It''s')

위의 예시를 보면 실제로 It's라는 문자열을 검색하는 명령임을 알 수 있다.


정리

= 연산자로는 동일한 값만 비교 가능한 아쉬움을 패턴 매칭으로 해결할 수 있음을 알게 되었다.

하지만 보다 복잡한 패턴을 비교해야 하는 경우는 패턴 매칭보다는 정규 표현식(Regular Expression)을 사용하는 편이 더 나을 수 있다.

대부분의 데이터베이스가 정규 표현식을 지원하고 정규 표현식이 더 많은 메타문자를 지원하기 때문에 간단한 패턴에 대해서 이러한 패턴 매칭을 사용하면 훨씬 유연하게 조회를 할 수 있을 것이다.

출처

https://lxxjn0-dev.netlify.app/first-step-sql-lec-08

profile
반갑습니다람지

0개의 댓글