=
연산자로 검색하는 경우 데이터의 값이 완전히 동일한지를 비교하게 된다.
하지만 특정 문자나 문자열이 포함되어 있는지를 검색하고 싶은 경우도 많을 것이다.
이런 경우 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%');
예제 테이블에서 no열이 2인 행의 text열 값을 보면 메타문자인 %와 _가 포함되어 있다.
만약 메타문자와 동일한 문자로 LIKE로 검색할 경우 어떻게 패턴을 정의해야 할까?
프로그래밍 언어에서는 이런 경우 대체로 이스케이프라는 방법으로 처리한다.
이스케이프 문자\
를 메타문자 앞에 붙이면 메타문자도 패턴에 사용할 수 있다.
SELECT * FROM sample25 WHERE (text LIKE '%\%%');
메타문자는 이스케이프로 처리할 수 있음을 확인하였다.
그렇다면 패턴과 같이 문자열 상수 안에 '
를 포함하고 싶다면 어떻게 해야 할까?
이때는 이스케이프 문자가 아니라 동일한 문자인 '
를 앞에 한 번 더 붙여주면 된다.
WHERE (text LIKE 'It''s')
위의 예시를 보면 실제로 It's라는 문자열을 검색하는 명령임을 알 수 있다.
=
연산자로는 동일한 값만 비교 가능한 아쉬움을 패턴 매칭으로 해결할 수 있음을 알게 되었다.
하지만 보다 복잡한 패턴을 비교해야 하는 경우는 패턴 매칭보다는 정규 표현식(Regular Expression)을 사용하는 편이 더 나을 수 있다.
대부분의 데이터베이스가 정규 표현식을 지원하고 정규 표현식이 더 많은 메타문자를 지원하기 때문에 간단한 패턴에 대해서 이러한 패턴 매칭을 사용하면 훨씬 유연하게 조회를 할 수 있을 것이다.