[프로그래머스] SQL 고득점 Kit : String, Date
※ 모든 코드는 Oracle을 기준으로 작성되었습니다.
1. 루시와 엘라 찾기
문제 설명
Solution
1
2
3
4
|
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID;
|
코드해석
WHERE절을 IN을 사용하면 해당 칼럼 내에서 일치하는 값을 갖는 행을 추출할 수 있습니다.
> WHERE 칼럼명 IN (값1, 값2, ...)
2. 이름에 el이 들어가는 동물 찾기
문제 설명
Solution
1
2
3
4
5
|
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE REGEXP_LIKE (NAME, 'el', 'i')
AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME;
|
코드해석
칼럼 내 값에서 특정 문자를 포함하는지 탐색하기 위해 REGEXP_LIKE 함수를 사용합니다. REGEXP_LIKE 함수는 다양한 정규표현식과 함께 사용되어 조건에 맞는 행을 추출할 때 사용합니다. 여기서는 단순히 'el'을 포함하는지를 알아볼 것이므로 다음과 같이 사용합니다.
> REGEXP_LIKE(칼럼명, 포함되는 문자, 'i')
세번째 인수인 'i'는 대소문자를 구분하지 않고 탐색한다는 의미입니다. 이 문제에서 이름에 'el'이 들어갈뿐만 아니라 개인 경우만 조회할 것이기 때문에 WHERE절 내에서 조건을 AND로 연결합니다.
3. 중성화 여부 파악하기
문제 설명
Solution
1
2
3
4
|
SELECT ANIMAL_ID, NAME,
CASE WHEN REGEXP_LIKE (SEX_UPON_INTAKE, 'Neutered | Spayed') THEN 'O' ELSE 'X' END 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
|
코드해석
IS NULL편 3번에서 사용한 CASE 함수와 앞에서 보신 REGEXP_LIKE 함수를 동시에 적용하였습니다. SEX_UPON_INTAKE 칼럼 내에서 Neutered 또는(연산자로 | 를 사용합니다) Spayed를 포함하는 값을 갖는다면 'O'를, 포함하지 않는다면 'X'를 출력하고 칼럼명은 중성화라고 지정했습니다. 실행 결과는 아래와 같습니다.
4. 오랜 기간 보호한 동물 (2)
문제 설명
Solution
1
2
3
4
5
6
|
SELECT ANIMAL_ID, NAME
FROM (SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O JOIN ANIMAL_INS I
ON O.ANIMAL_ID = I.ANIMAL_ID
ORDER BY O.DATETIME - I.DATETIME DESC)
WHERE ROWNUM <= 2;
|
코드해석
입양을 간 동물 중, 보호 기간ㅇ이 가장 길었던 동물 두 마리를 조회하기 위해 서브쿼리와 조인을 사용하였습니다. ANIMAL_OUTS 테이블과 ANIMAL_INS 테이블을 각 테이블의 ANIMAL_ID 칼럼을 사용하여 내부조인한 후, 입양일(ANIMAL_OUTS 테이블의 DATETIME) - 보호 시작일(ANIMAL_INS 테이블의 DATETIME)로 보호 기간을 계산합니다. 보호 기간을 계산하고 내림차순 정렬로 보호 기간이 긴 동물이 위쪽에 출력되도록 합니다. 이후 WHERE절에서 상위 2개 행을 추출합니다.
5. DATETIME에서 DATE로 형 변환
문제 설명
Solution
1
2
3
|
SELECT ANIMAL_ID, NAME, TO_CHAR(DATETIME, 'YYYY-MM-DD') DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;.
|
코드해석
동물이 들어온 날짜인 보호 시작일은 [년-월-일 시:분:초]로 구성된 DATETIME 형 칼럼입니다. 날짜를 조회하기 위해 TO_CHAR 함수를 사용하여 [년-월-일]만 추출하였습니다. 실행 결과는 아래와 같습니다.
