인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Rhea Park님의 프로필 이미지
Rhea Park

작성한 질문수

[백문이불여일타] 데이터 분석을 위한 고급 SQL

해커랭크 조인 조건이 특이한 문제 풀이 + BETWEEN을 조인 조건으로 쓰기

The Report : 다른 CASE문 했더니 NULL이 거꾸로 적용돼요

작성

·

312

1

시도1.  SELECT CASE s.Name WHEN g.Grade < 8 THEN "NULL" ELSE s.Name END
            8,9,10 GRADE인 경우가 NULL,  8 미만은 이름이 나옴  => FAIL
시도2.   SELECT CASE s.Name WHEN g.Grade < 8 THEN "NULL" ELSE s.Name END
            강의와 똑같이,  8,9,10 GRADE인 경우 이름, 8 미만은 NULL 나옴 => SUCCESS
강의 : SELECT CASE WHEN g.Grade < 8 THEN NULL ELSE s.Name END as name,  

질문 : 왜 동일한 CASE문인데 저의 시도에서는 grade >= 8 해야 강의의 grade <8 과 같은 결과가 나오나요?

답변 1

1

윤선미님의 프로필 이미지
윤선미
지식공유자

안녕하세요! 재미있는 질문을 주셨네요.

  

1. CASE WHEN 사이에 컬럼명을 넣는 경우에는 CASE WHEN 붙여서 쓰는 경우와 연산 규칙이 조금 다른데요. 구체적으로 어떻게 다른지는 아래 링크를 참고하시면 좋을 같습니다 :)

간단하게 예를 들어보면 "CASE value WHEN 3 THEN 'yes' ELSE 'no' END" 라는 코드가 있다고 생각했을 , value = 3 연산을 해서 참일경우 THEN 으로, 거짓일 경우 ELSE 결과물을 계산합니다.

  

2. 그러면 보내주신 코드에서도 s.name = (g.Grade < 8) 연산을 하겠죠. g.Grade < 8 출력을 해보시면 아시겠지만, grade 값이 8보다 작으면 1, 그렇지 않으면 0으로 계산이 됩니다.

  

3. 그리고 MySQL 숫자와 문자를 비교연산할 , 문자를 자동으로 0으로 캐스팅하여 비교합니다. 구체적인 예시는 아래 링크를 참고해주세요.

  

4. 그러면 g.grade < 8 0 , grade 값이 8 이상일 s.name = (g.Grade < 8) 연산의 결과가 참이 되고 따라서 CASE 문에서 THEN 뒤의 값으로 계산이 되겠죠. 반대의 경우에는 ELSE 뒤의 값으로 계산이 것이고요.

  

그러면 결과가 반대로 나오는지 이해가 되실 같습니다 :)

Rhea Park님의 프로필 이미지
Rhea Park
질문자

우와 강의 찍은지 좀 되신 것이라 바로 답변 달릴 줄 몰랐는데 
제가 여쭙고 싶었던 것보다 더 많이 얻어갑니다!

문자가 0으로 캐스팅 되는 것,   TRUE이면 1 FALSE이면 0인 것, CASE WHEN 구문 2개 차이부터 해서 친절하게 설명해주셔서 정말감사합니다

Rhea Park님의 프로필 이미지
Rhea Park

작성한 질문수

질문하기