WHERE 처럼 조건문을 수행해주는 명령어 (DECODE, CASE)
: 동등(=) 조건일때 사용하는 함수
-DECCODE(기준값, 비교값1, 결과1, 결과2 ) - 기준값이 비교값과 같으면 결과1일 출력되고 다르면 결과2가 출력
-DECODE)기준값, 비교값,결과1) - 기준값이 비교값이 같으면 결과1 출력 다르면 NULL
-DECODE(기준값, 비교값, DECODE(기준값2, 비교값2, 결과2,결과3) 결과4)
-기준값이 비교값과 같으면 DECODE 실행 (기준값2이 비교값2와 같으면 결과2 출력, 다르면 결과3 출력
기준값이 비교값과 다르면 결과4 출력
WHEN
: 비교(<,>, >=, <=,=) 등의 여러 조건을 처리하는 조건문
-CASE 변수
-WHEN 값1 THEN 결과값1 -- 변수와 값1이 같으면 결과값1이 출력
-WHEN 값2 THEN 결과값2 -- 변수와 값1이 같이않고, 변수와 값2가 같으면 결과값 2
....
-ELSE 결과값3 -- 위의 모든 값이 변수와 같이 않으면 결과값3 출력 (생략가능)
END
--책이름이 ‘축구’,‘야구’,’농구’,’골프’ 관련책은 ‘구기종목’, 피겨 관련 책은 ‘스케이팅’, 역도 관련 책은 ‘체조’ 그 외 모든 책은 ‘스포츠’로 출력하는 ‘종목’컬럼을 만들어 책번호, 책이름, 출판사, 종목을 출력
SELECT bookid, bookname, publisher,
CASE
WHEN (bookname LIKE '%축구%'
OR bookname LIKE '%야구%'
OR bookname LIKE '%농구%'
OR bookname LIKE '%골프%') THEN '구기종목'
WHEN bookname LIKE ('%피겨%') THEN '스케이팅'
WHEN bookname LIKE ('%역도%') THEN '체조'
ELSE '스포츠'
END "종목"
FROM book;
--모든 책의 평균 가격 이상의 책은 ‘평균가이상’, 미만은 null로 출력하는 ‘평균' '가’ 컬럼을 만들어 책이름, 가격, 평균가를 출력
SELECT *
FROM book;
SELECT price, '평균가이상'
FROM book
WHERE price >= (SELECT AVG(price)
FROM book);
SELECT bookname, price,
CASE
WHEN price >= (SELECT AVG(price) FROM book) THEN '평균가이상'
ELSE null
END "평균가"
FROM book;
--책의 가격이 10000원 이하인 책들은 1000원 인상하고, 초과인 책은 가격은 변동없이 책이름, 가격, 변동가격으로 출력
SELECT bookname, price,
CASE
WHEN price <= 10000 THEN price + 1000
ELSE price
END "변동가격"
FROM book;
--전화번호가 있는 고객은 ‘비공개’ 없는 고객은 ‘입력필요’로 고객의 모든 정보를 출력
SELECT *
FROM orders;
SELECT c.*,
DECODE(phone, null, '입력필요', '비공개')
FROM customer c;
--주문 내역 중 할인이 들어간 책은 ‘할인’, 가격에 변동이 없는 책은 ‘변동없음’으로 출력하는 컬럼을 추가하여 책이름, 출판사, 가격, 판매가격, 할인내역을 출력
SELECT bookname, publisher, price, saleprice,
CASE
WHEN (price-saleprice) > 0 THEN '할인'
WHEN (price-saleprice) = 0 THEN '변동없음'
ELSE '기타'
END
FROM book b, orders o
WHERE b.bookid = o.bookid;
--책을 구매한 내역이 있는 고객에게 쿠폰을 제공하고 구매 내역이 없는 고객은 제공하지 않게 ‘쿠폰’ 컬럼을 만들어 ‘제공’, ‘미제공’으로 고객이름, 쿠폰 컬럼 출력
SELECT c.name,
MAX(CASE
WHEN o.orderid is null THEN '미제공'
ELSE '제공'
END) "쿠폰"
FROM orders o, customer c
WHERE o.custid(+) = c.custid
GROUP BY c.name;
--주문을 3번 이상한 고객은 ‘최우수회원’, 2번은 ‘우수회원’, 1번은 ‘일반회원’, 0번은 ‘잠재고객’ 으로 '멤버십’ 컬럼을 만들어 이름과 함께 출력
SELECT c.custid, c.name,
CASE
WHEN count(c.name) >= 3 THEN '최우수회원'
WHEN count(c.name) = 2 THEN '우수회원'
WHEN count(c.name) = 1 THEN (CASE
WHEN min(o.orderid) is null THEN '잠재고객'
ELSE '일반회원'
END)
END "멤버십"
FROM orders o, customer c
WHERE o.custid(+) = c.custid
GROUP BY c.custid, c.name;
select *
FROM orders o, customer c
WHERE o.custid(+) = c.custid;