Case Expression.
감 잡으셨겠지만, 이런 경우엔 이렇게 하고 저런 경우엔 저렇게 하라 하는 문구다. 다른 언어에서는 if... then... else... 라고 많이 쓰인다. SQL에 이문구를 접해보지 못한 사람들은 그냥 데이타를 EXCEL이나 ACCESS옮겨 변형을 하기도 하지만, 사이즈가 너무 클 경우엔 불가능 하고, 또 사이즈가 작더라도 미리 변형해서 데이타를 유출하면 시간절약 엄청 된다. 이런 차원에서참 유용하게 쓰일수 있다. 잡소린 그만 하고, 예문부터 보자.
SELECT country_name, region_id,
CASE region_id WHEN 1 THEN 'Europe'
WHEN 2 THEN 'America'
WHEN 3 THEN 'Asia'
ELSE 'Other' END Continent
FROM countries
WHERE country_name LIKE 'I%';
자 보시다 시피, 이걸 말로 풀어 설명하면, country_name 이 I 로 시작하는 나라, 지역번호, 대륙을 핮는데, 대륙은 지역번호가 1일때는 'Europe', 2일때는 'America' 3일때는 'Asia' 그 외일때는 'Other' 로 넣어라 하는 문구이다. 결과를 보면, 이렇게 나온다.
COUNTRY_NAMEREGION_ID CONTINE
-------------------- ---------- ----------
Israel 4 Other
India 3 Asia
Italy 1 Europe
------------------------------------------
기억해야할 것 은 기본적인 골격이다.
CASE < expression>
WHEN < compare value> THEN < return value> … … …
[ELSE < return value>]
END
또 거의 그럴일은 없지만, WHEN은 128번 까지만 쓰일수 있고 ELSE 는 꼭 있지 않아도 된다. 다른 예문, 골격을 하나 보자.
CASE
WHEN < condition> THEN < return value> … … …
[ELSE < return value>]
END
SELECT first_name, department_id, salary,
CASE WHEN salary < 6000 THEN 'Low'
WHEN salary < 10000 THEN 'Medium'
WHEN salary >= 10000 THEN 'High' END Category
FROM employees
WHERE department_id <= 30
ORDER BY first_name;
이번에는 condition이 들어 갔기에, 기준이 되는 column이름이 WHEN다음에 온다. 결과는,
FIRST_NAME DEPARTMENT_ID SALARYCATEGO
-------------------- ---------------- ---------- --------
Alexander 30 3100 Low
Den 3011000 High
Guy 302600 Low
Jennifer 104400 Low
Karen 302500 Low
Michael 2013000 High
Pat 20 6000Medium
Shelli 30 2900 Low
Sigal 302800 Low
---------------------------------------------------------
이거 외에도, 다른 식으로도 응용이 무궁무진하게 가능하다. 다루는 데이타에 따라, 계산 (더하기 뺴기 나누기 곱하기), 또는 반올림, 내림,기타 등등등... 많이 있다. 마지막 예를 한번 보자.
SELECTconnectseconds,
CASE WHEN connectseconds <= 30 and connectseconds > 0 THEN 30
ELSE ceiling((connectseconds-30)/6.00)*6 + 30 END CONSEC
FROM call
WHERE custserviceid = '14851291'
결과는
connectseconds CONSEC
-----------------------------
319 324
260 264
76 78
14 30
60 60
14 30
163 168
116 120
______________________________
간단한 설명을 부치자면, connectseconds 이 30초 이하, 0초 초과일 경우 CONSEC는 무조건 30이고 그 외는 30초 이후에 6씩 올림 해라 하는 문구이다.
'오라클 실무..' 카테고리의 다른 글
쿼리를 이용해서 달력을 만들기 (1) | 2006.05.17 |
---|---|
[펌] GROUP BY의 고급 응용 (1) | 2006.05.17 |
HINT 사용법 (1) | 2006.05.16 |
사용자추가하기 (1) | 2006.05.16 |
날짜단위의 연산에서...... (1) | 2006.05.16 |