와일드카드 매칭 LIKE vs ILIKE
LIKE
는 대소문자를 구분하며, ILIKE
는 대소문자를 구분하지 않는다.
LIKE
1
2
3
| SELECT COUNT(*)
FROM ufo
WHERE description LIKE '%wife%';
|
1
2
3
| SELECT COUNT(*)
FROM ufo
WHERE LOWER(description) LIKE '%wife%';
|
첫 번째는 6231개, 두 번째는 6439개로 다른 개수가 나타났다. 첫 번째의 경우 Wife와 wife가 서로 다른 글자로 인식되기 때문이다. 대소문자 상관 없이 Wife나 wife 글자가 들어간 description의 행의 개수는 총 6439개이다.
ILIKE
1
2
3
| SELECT COUNT(*)
FROM ufo
WHERE description ILIKE '%wife%';
|
1
2
3
| SELECT COUNT(*)
FROM ufo
WHERE LOWER(description) ILIKE '%wife%';
|
ILIKE는 대소문자를 구분하지 않기 때문에 두 경우 모두 같은 개수가 나타난다.
wife 또는 husband가 들어간 행의 수
1
2
3
4
| SELECT COUNT(*)
FROM ufo
WHERE LOWER(description) LIKE '%wife%'
OR LOWER(description) LIKE '%husband%';
|
AND, OR 우선순위
1
2
3
4
5
| SELECT COUNT(*)
FROM ufo
WHERE LOWER(description) LIKE '%wife%'
OR LOWER(description) LIKE '%husband%'
AND LOWER(description) LIKE '%mother%';
|
1
2
3
4
5
| 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 단어가 담겨 있는 경우의 개수를 센다.
1
2
3
4
5
6
7
8
9
10
11
12
| 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
의 값을 반환해준다.1
2
3
4
5
6
7
8
9
| 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 단어가 들어가는 경우의 개수를 센다.
1
2
3
4
5
6
| 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;
|