https://school.programmers.co.kr/learn/courses/30/lessons/151137

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드설명

GROUP BY + LIKE 를 활용합니다.

 

문제에서 WHERE조건을 통하여 먼저 해당 옵션이 포함된 차들을 먼저 필터링합니다.

GROUP BY 에서 HAVING 절을 통한 필터링은 불가합니다. HAVING 절은 집계된 결과에 대한 필터링을 수행하는 데 사용하고, 해당 집계 함수를 사용한 열만을 참조할 수 있습니다. 즉, 집계된 결과에 대한 조건을 제공해야 합니다.

직설적으로 말하면, 이유는 SELECT 부분에서 해당 OPTIONS가 호출되지 않기에 사용되지 못합니다.

코드

SELECT CAR_TYPE AS CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%가죽시트%' 
OR OPTIONS LIKE '%통풍시트%' 
OR OPTIONS LIKE '%열선시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC;

 

-- SELECT *
-- FROM CAR_RENTAL_COMPANY_CAR
-- WHERE OPTIONS LIKE '%통풍시트%' OR '%열선시트%' OR '%가죽시트%'
-- 처음에 오른쪽처럼 처리했는데, OR OPTIONS LIKE ~ , OR OPTINS LIKE 이렇게 각각 OR 논리연산자마다 조건을 각각 해줘야 합니다.
-- 처음에 틀린 방법입니다. WHERE OPTIONS LIKE '%통풍시트%' OR '%열선시트%' OR '%가죽시트%'
SELECT CAR_TYPE AS CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%통풍시트%' 
    OR OPTIONS LIKE '%열선시트%' 
    OR OPTIONS LIKE '%가죽시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC

 

ORACLE

LIKE를 사용하지 않고, REGEXP_LIKE를 사용했습니다.

물론 LIKE를 사용해도 됩니다만, 더 깔끔해집니다.

아직 ORACLE에 완전히 익숙하지는 않아서 REGEXP_LIKE 의 구현에 있어서 실수가 있었습니다.

1. 처음에는 아래와 같이  '[]' 대괄호로 묶고, 

2. || 로 OR 연산을 처리하고,

3. 띄어쓰기가 존재

WHERE REGEXP_LIKE(CRCC.OPTIONS, '[통풍시트 || 열선시트 || 가죽시트]')

 

하지만 위의 3가지 를 모두 다른 것으로 변경시켜야 합니다.

대괄호로 묶는 것은 [ABC]라면, A B C 각 문자가 존재하는지 파악합니다.

우리가 원하는건 각 문자가 아닌 단어입니다. 그러므로 ( ) 를 사용하고, || 대신에 | 를 사용해야 합니다.  띄어쓰기를 없애주어야 띄어쓰기까지 검색하지 않습니다.

 

정답 코드입니다. 물론 이 코드도 LIKE 문을 사용할 수 있습니다.

SELECT CRCC.CAR_TYPE AS CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR CRCC
WHERE REGEXP_LIKE(CRCC.OPTIONS, '(통풍시트|열선시트|가죽시트)')
GROUP BY CRCC.CAR_TYPE
ORDER BY CRCC.CAR_TYPE ASC

 

 

+ Recent posts