데이터를 특정조건으로 출력하려면 Where
을 이용하는 방법이 있지만
IF
IFNULL
ISNULL
CASE WHEN THEN
을 이용해서 조금더 다양한 조건을 줄 수 있다
IFNULL(comm,0)
은 컬럼 comm
의 데이터가 NULL 이라면 0 으로, NULL이 아니라면 comm
그대로 출력한다
ISNULL()
은 안에 들어간 데이터에 따라 TRUE
와FALSE
를 출력한다.
( 일반적으로 프로그래밍에서 IS
로 시작하는함수는 bool
값을 리턴한다. )
위의 두 함수를 이용하면
SELECT
ENAME, SAL, COMM,
IFNULL (comm,'feef') AS IFNULL,
IF (isnull(COMM), SAL*0, SAL+COMM) AS ISNULL
from emp;
isnull(COMM)
은 true
와 false
를 출력하는데 참이라면 콤마로 나누어진 두번째 조건을, 거짓이라면 마지막 조건을 출력한다. 아래와 같은 결과가 나오게 된다.
즉, 삼항연산자와 같은 모양이다.
다른 예제로 다음과 같은 결과를 얻을수 있다.
SELECT
EMPNO, ENAME, COMM,
IF (isnull(COMM), 'NULL', 'EXIST') AS NVL2
FROM EMP
WHERE DEPTNO = 30;
SELECT name, tel,
case substr(tel, 1, instr(tel, ')'))
when 02 then "SEOUL"
when 031 then "GYEONNGGI"
when 051 then "BUSAN"
when 052 then "ULSAN"
when 055 then "GYEONGNAM"
else "ETC" # else 는 생략가능
end "LOC"
FROM student WHERE deptno1 = 201 ;
case
뒤에는 데이터나 컬럼이 들어가면서 <조건>을 만든다. (생략가능)
when
과 then
은 if 와 유사한데 첫번째 줄은 데이터가 02
라면 "SEOUL"
로 출력을 한다.
여러개의 쌍을 이어 갈 수 있고 데이터에 언급한 내용이 없다면 else
의 값을 출력한다 else
는 생략할수도 있다.
마지막 end
는 새롭게 만들어질 컬럼의 이름을 정한다
SELECT name,pay,
case when pay between 1 and 300 then "grade 1"
when pay between 301 and 400 then "grade 2"
when pay between 401 and 500 then "grade 3"
when pay > 500 then "grade 4"
end "grade"
FROM professor order by pay desc;
when
다음 구체적인 조건을 준다면 case
뒤를 비워둘 수도 있다.
SELECT empno, ename, comm,
case when comm is null then '해당사항없음'
when comm = '0' then '수당없음'
when comm > 0 then concat('수당 : ', comm) -- '수당'과 comm 컬럼의 데이터 연결
end 'comm.text'
FROM emp;
SELECT name,
case when absent >= 4 then 'F'
when score >= 90 then 'A'
when score >= 80 then 'B'
when score >= 70 then 'C'
when score >= 60 then 'D'
else 'F'
end grade
FROM student;
가장 위의 조건이 우선된다. 결석이 4회 이상이면 점수가 100이라도 무조건 'F'가 된다.