금일도 역시 SQL 문제를 끄적이다,
또 다양한 문제 풀이 방법들을 찾아보다 처음보는 함수가 있어 구글에 서치 서치.. 해 보았다.
금일 문제
문제 설명 : ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.
ANIMAL_INS 테이블 구조는 다음과 같으며,
ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 의미합니다.
"보호소의 동물이 중성화되었는지 아닌지"
(중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 포함)
동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성
(이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시)
내가 작성한 코드 풀이 (IF 함수)
SELECT ANIMAL_ID,
NAME,
IF (SEX_UPON_INTAKE LIKE '%Intact%', 'X', 'O') "중성화"
FROM ANIMAL_INS
ORDER BY 1
문제를 보며 내가 짚은 포인트는 중성화가 되지 않은 동물의 경우, 'SEX_UPON_INTAKE' 컬럼 내 중성화가 되어 있지 않은 동물들은 'Intact'라는 텍스트를 포함하고 있다는 것이었고,
때문에 IF 함수를 활용 Intact 텍스트가 포함되어 있는 동물들은 X로, False일 경우 O로 표기하도록 하여 맞는 코드를 작성할 수 있었다.
풀어보면서 '근데 SEX_UPON_INTAKE 내 경우의 수가 다양하면 어떡하지?'라는 의문이 들었고, 다른 사람들이 작성한 코드들을 살펴보았다.
CASE WHEN 함수 활용 코드
SELECT
ANIMAL_ID,
NAME,
CASE WHEN SEX_UPON_INTAKE LIKE 'Neutered%' or SEX_UPON_INTAKE LIKE 'Spayed%' then 'O'
ELSE 'X'
END "중성화"
FROM ANIMAL_INS
ORDER BY 1
CASE WHEN 함수 내 LIKE 활용 중성화 관련 텍스트가 포함될 경우 O로 표기되도록, 아닐 경우(ELSE) X가 표기되도록 작성하였고,
'해당 문제는 앞서 설명한 IF와 CASE WHEN 함수 둘 중 자유롭게 활용하면 될 문제구나' 생각하였기에 예상한 답안이었다.
CASE WHEN 함수 내 REGEXP_LIKE 활용 코드
SELECT ANIMAL_ID,
NAME,
CASE WHEN REGEXP_LIKE(SEX_UPON_INTAKE,'^Neutered|^Spayed') THEN 'O'
ELSE 'X' END "중성화"
FROM ANIMAL_INS
ORDER BY 1
REGEXP_LIKE?
하단에 에시를 보며 이해하면 쉽다.
일반 LIKE 검색에서 쓰이는 ‘%’처럼 모든 문자를 매치하는 방법은 ‘.*’를 사용한다. 문자 사이에 사용된 ‘.*’는 모든 문자를 의미한다. ‘a.*c.*B’는 문자 a,c,B가 순서대로 있는 모든 문자열을 선택하고 세번째 파라메터 ‘i’는 대소문자 구분을 하지 않는다는 의미이다.
( 'c' - 대소문자 구분함 (디폴트))
SELECT COL
FROM TBL
WHERE REGEXP_LIKE (COL,'a.*c.*B','i')
이외에도 활용법이 다양해 참고한 링크를 하단에 첨부한다. 보면서 좀 자세히 정리해봐야겠다!
http://blog.iotinfra.net/?p=2497
REGEXP_LIKE(SEX_UPON_INTAKE,'^Neutered|^Spayed')
는 결국 'Neutered로 시작하거나, Spayed로 시작하면'이라는 의미이고 그래서 다음과 같이 쿼리 작성이 가능하다.
응용하면 LIKE IN 문장처럼도 구사 가능하다!
REGEXP_LIKE(NAME, '^G|^S|^T) : G or S or T류 시작하면 True