대규모 텍스트에서 문자열 찾기 - LIKE, ILIKE

ddoddo·2023년 2월 7일
0

와일드카드 매칭 : LIKE, ILIKE

LIKE vs ILIKE

LIKE는 대소문자를 구분하며, ILIKE는 대소문자를 구분하지 않는다.

LIKE

SELECT COUNT(*)
FROM ufo
WHERE description LIKE '%wife%';

SELECT COUNT(*)
FROM ufo
WHERE LOWER(description) LIKE '%wife%';

첫 번째는 6231개, 두 번째는 6439개로 다른 개수가 나타났다. 첫 번째의 경우 Wife와 wife가 서로 다른 글자로 인식되기 때문이다. 대소문자 상관 없이 Wife나 wife 글자가 들어간 description의 행의 개수는 총 6439개이다.

ILIKE

SELECT COUNT(*)
FROM ufo
WHERE description ILIKE '%wife%';
SELECT COUNT(*)
FROM ufo
WHERE LOWER(description) ILIKE '%wife%';

ILIKE는 대소문자를 구분하지 않기 때문에 두 경우 모두 같은 개수가 나타난다.

wife 또는 husband가 들어간 행의 수

SELECT COUNT(*)
FROM ufo
WHERE LOWER(description) LIKE '%wife%'
	OR LOWER(description) LIKE '%husband%';

AND, OR 우선순위

SELECT COUNT(*)
FROM ufo
WHERE LOWER(description) LIKE '%wife%'
	OR LOWER(description) LIKE '%husband%'
	AND LOWER(description) LIKE '%mother%';

SELECT description
FROM ufo
WHERE (LOWER(description) LIKE '%wife%'
	OR LOWER(description) LIKE '%husband%')
	AND LOWER(description) LIKE '%mother%';

AND가 OR보다 우선순위가 높다. -> AND > OR
OR를 우선순위로 적용하고 싶다면 괄호()를 통해 우선순위를 지정해주어야 한다.

driving, walking, running, swimming

UFO를 목격한 설명이 담긴 description 컬럼에 driving, walking, running, swimming 단어가 담겨 있는 경우의 개수를 센다.

SELECT
	(CASE
	 	WHEN LOWER(description) LIKE '%driving%' THEN 'driving'
	 	WHEN LOWER(description) LIKE '%walking%' THEN 'walking'
	 	WHEN LOWER(description) LIKE '%%running' THEN 'running'
	 	WHEN LOWER(description) LIKE '%swimming%' THEN 'swimming'
	 	ELSE 'none'
	END) AS activity,
	COUNT(*)
FROM ufo
GROUP BY 1
ORDER BY 2 DESC;

SELECT절에 와일드카드 매칭 사용

  • 보통 LIKE나 ILIKE를 사용할 때 WHERE 절에 사용하는 경우가 많다.
  • 그러나 SELECT 절에 사용할 경우 True or False의 값을 반환해준다.
SELECT
	description ILIKE '%south%' AS south,
	description ILIKE '%north%' AS north,
	description ILIKE '%east%' AS east,
	description ILIKE '%west%' AS west,
	COUNT(*)
FROM ufo
GROUP BY 1, 2, 3, 4
ORDER BY 1, 2, 3, 4;

south, north, east, west

UFO를 목격한 설명이 담긴 description 컬럼에 south, north, east, west 단어가 들어가는 경우의 개수를 센다.

SELECT
	COUNT(CASE WHEN description ILIKE '%south%' THEN 1 END) AS south,
	COUNT(CASE WHEN description ILIKE '%north%' THEN 1 END) AS north,
	COUNT(CASE WHEN description ILIKE '%east%' THEN 1 END) AS east,
	COUNT(CASE WHEN description ILIKE '%west%' THEN 1 END) AS west
FROM ufo;

0개의 댓글