본문 바로가기
데이터 분석/SQL 연습문제

코테 연습 25일차 (프로그래머스 SQL 고득점 Kit)

2022. 3. 8.

My SQL / sublime

 

코딩테스트 연습 - 중성화 여부 파악하기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.


풀이

제출한 오답 1

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, REPLACE(SEX_UPON_INTAKE,'Neutered','O')
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

-> '문자열 치환'이라고 검색하여 REPLACE를 알아냈다. 문제는 'Neutered'와 'Spayed' 둘 다 'O'로 치환되어야 하는 것이다. 그리고 위와 같이 조회하면 'O Male'과 같은 결과가 나온다.

몰랐던 문법 1

REPLACE (컬럼명, '기존문자열', '변경문자열')

다시 '문자열 치환 여러개'로 검색한 결과 CASE 문을 발견!

제출한 답

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, 
CASE WHEN SEX_UPON_INTAKE ='Neutered Male' THEN 'O'
    WHEN SEX_UPON_INTAKE ='Spayed Female' THEN 'O' 
    ELSE 'X' END AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

몰랐던 문법 2

CASE
WHEN 조건 1 THEN 출력 데이터 1
WHEN 조건 2 THEN 출력 데이터 2
...
ELSE 출력 데이터 x
END

다른 방법은 없을까?

다른 답

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, 
(CASE WHEN SEX_UPON_INTAKE REGEXP 'Neutered Male|Spayed Female' THEN 'O' 
	ELSE 'X' END) AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

-> CASE WHEN 과 REGEXP를 혼합해서 사용하면 여러 문자열에 대해 치환도 적용할 수 있고 나머지 케이스에 대해서도 정의해줄 수 있다.

몰랐던 문법 3

WHERE 컬럼 A REGEXP '문자열 1|문자열 2|'
-> 조건: 컬럼 A에서 '문자열 1' 또는 '문자열 2'을 포함한 값 

아래와 같이 LIKE를 활용하는 것보다 간결하게 작성할 수 있음
WHERE 컬럼 A LIKE '%문자열 1%' OR 컬럼 A LIKE '%문자열 2%'...

2022.03.08

댓글