[SQL] 문자열에서 특정 문자(열)가 나오는 횟수 구하기

문자열 안에 원하는 문자, 또는 문자열이 몇 번이나 나오는지르 횟수를 구하는 방법입니다.

문자가 나오는 횟수 구하기

문자가 나오는 횟수는 문자열 바꾸기 함수를 이용합니다.

문자열 길이 - 찾는 문자를 없앤 문자열 길이

를 하면 찾는 문자를 몇 개 없앴는지 확인할 수 있기 때문에 찾는 문자가 몇 개 있었는지를 알 수 있습니다.

참고로 DB별 문자열 길이를 얻는 함수는 다음과 같습니다.

DB 함수 "I love you" "라이언"
MySQL CHAR_LENGTH(string)
CHARACTER_LENGTH(string)
10 3
MSSQL LEN(string) 10 3
Oracle LENGTH(string) 10 3

문자가 나오는 횟수를 구하려면 문자열을 바꾸는 함수도 필요합니다.

문자열을 바꾸는 함수는 MySQL, MSSQL, Oracle 모두 동일하며 사용법은 다음과 같습니다.

REPLACE(string, , pattern, replacement)

DB 종류에 따라 문자열 길이와 바꾸기 함수를 사용해 문자가 나오는 횟수를 구하는 방법은 다음과 같습니다.

DB 사용법
MySQL CHAR_LENGTH(string) - CHAR_LENGTH(REPLACE(string,,))
MSSQL LEN(string) - LEN(REPLACE(string,,))
Oracle LENGTH(string) - LENGTH(REPLACE(string,,))

SQL Server 예제는 다음과 같습니다. 쿼리 결과는 3입니다.

Declare @string varchar(1000);
Set @string = '라이언,어피치,콘,프로도';
select LEN(@string) - LEN(REPLACE(@string,',',''));

문자열이 나오는 횟수 구하기

문자가 나오는 횟수를 구하는 방법에서 조금 더 나아가서 2개 이상의 문자로 구성된 문자열이 몇 번 나오는지를 다음 방식으로 알 수 있습니다.

앞서의 문자 횟수 구하기한 결과를 찾는 문자열 길이로 나누면 됩니다. 쉽지만, 이 개념을 생각해내는게 어렵습니다.

(문자열 길이 - 찾는 문자열을 없앤 문자열 길이) / 찾는 문자열 길이

SQL Server 예제는 다음과 같습니다. 쿼리 결과는 4입니다.

Declare @string varchar(1000);
Set @string = '나를 사랑하고 내게 사랑받는 사랑 이상의 사랑을 하였지요.';
select (LEN(@string) - LEN(REPLACE(@string,'사랑',''))) / LEN('사랑');

오라클 REGEXP_COUNT()

오라클은 문자(열)이 나오는 횟수를 카운트해서 반환하는 REGEXP_COUNT() 함수를 제공합니다.

이름에서 알 수 있는 것처럼 정규표현식을 사용할 수 있습니다.

사용 방법은 다음과 같습니다.

REGEXP_COUNT(string, match)

다음 쿼리문은 3을 반환합니다.

SELECT REGEXP_COUNT('라이언,어피치,프로도,콘', ',') AS REGEXP_COUNT FROM DUAL;