본문 바로가기
SQL/코딩테스트

[MySQL] CASE 문에서 WHEN 순서의 중요성

by Nanki 2024. 11. 4.

문제 내용 : Write a query identifying the type of each record in the TRIANGLES table using its three side lengths. Output one of the following statements for each record in the table:

Equilateral: It's a triangle with  sides of equal length.
Isosceles: It's a triangle with  sides of equal length.
Scalene: It's a triangle with  sides of differing lengths.
Not A Triangle: The given values of A, B, and C don't form a triangle

 

해석 : 

A,B,C 세 변의 길이가 주어진 3개의 변수를 사용하여 TRIANGLES 테이블의 각 레코드 유형을 식별하는 쿼리를 작성하세요. 테이블의 각 레코드에 대해 다음 명령문 중 하나를 출력합니다.

정삼각형 : 변의 길이가 같은 삼각형입니다.
이등변삼각형: 변의 길이가 같은 삼각형입니다.
부등변삼각형: 변의 길이가 다른 삼각형입니다.
삼각형이 아님: 주어진 A, B, C 값이 삼각형을 형성하지 않습니다.

 

풀이 매크로

1. 각 도형별 조건문 

  1)정삼각형 : A=B 그리고 B=C

  2)이등변삼각형 : A=B 또는 B=C 또는 A=C

  3)부등변삼각형 : A!=B 또는 A!=C 또는 C!=B

  4)삼각형이 아님 : A+B <= C 또는 A+C <= B 또는 B+C <= A

 

2. 조건들간의 포함조건 고려 :

  - '4)삼각형이 아님' 조건이 다른 조건들을 포함할 수 있음.

  - '1)정삼각형' 조건이 '2)이등변삼각형' 조건들을 포함할 수 있음.

 

3. 따라서 CASE문 작성순서는 4) > 1) > 2) > 3) 으로 작성함. 이는 조건범위가 좁은것부터 넓은 순으로 적어주고 데이터를 확인하면서 조건이 잘 맞는지 확인하는 방법만 있는 것 같다..

SELECT CASE
            WHEN ((A+B <= C) OR (B+C <= A) OR (A+C <= B)) THEN 'Not A Triangle'
            WHEN ((A=B) AND (A=C) AND (B=C)) THEN 'Equilateral'
            WHEN (A=B OR B=C OR A=C) THEN 'Isosceles'
            WHEN ((A!=B) AND (A!=C) AND (B!=C)) THEN 'Scalene'
       END
FROM TRIANGLES

 

잘못된 풀이과정

풀이 매크로 2)의 조건포괄을 고려하지 않으면 CASE문이 실행된 테이블 행에 대해서는 다음 CASE 조건문에 해당되더라도 CASE 아웃풋이 수정되지 않는다.  CASE 문 생성할 때 중복된 변수들을 이용할 경우 이점을 유의해아한다.

 

문제 출처 : https://www.hackerrank.com/challenges/what-type-of-triangle/problem