# IF / CASE

SQL 짜다 보면 문자나 숫자같은 데이터 넣는 곳이 많습니다.

근데 그 곳에 고정된 값이 아니라 조건에 따라서 각각 다른 값을 넣고 싶은 경우 사용하면 됩니다.&#x20;



### &#x20;**IF 함수**

```sql
IF(조건식, 조건식맞으면이거, 조건식틀리면이거); 


SELECT IF(1 + 2 = 3, '맞음', '틀림');
```

그런데 아쉽게도 ORACLE에서는 이렇게 IF문은 사용 할 수 없습니다.

(위 구문은 MySQL에서 사용가능)



### DECODE 함수

DECODE 함수는 오라클 쿼리에서 가장 많이 사용하는 함수 중 하나이다.&#x20;

표준 SQL 함수가 아니라서 사용을 꺼려하기도 하지만 잘 사용하면 아주 편하기 때문에 유용하다.

```sql
SELECT DECODE(근무기간  , 5, '왕고' , 4, '중간다리' , '막내')
FROM EMPLOYEE;
```

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2F6cgDbOXVHq3tujY2iqWu%2FScreenshot_29.png?alt=media&#x26;token=7d061bf6-761f-4a22-b9fb-3263d3947ff7" alt=""><figcaption></figcaption></figure>



{% embed url="https://gent.tistory.com/227" %}

DECODE 함수는  한계가 명확하고 (해당컬럼의 값이 특정값일 때만 사용 가능)

가독성과 성능 상의 문제로 JAVA나 JavaScript 처럼 조건을 주고싶다면

CASE WHEN을 사용합니다.



### **CASE 문법**&#x20;

```sql
CASE 
  WHEN 조건식1 THEN 남길값1
  WHEN 조건식2 THEN 남길값2
  WHEN 조건식3 THEN 남길값3
END 
```

문자나 숫자같은 데이터넣는 자리에 CASE 문법을 넣을 수 있습니다.&#x20;

CASE 문법 안에 조건식과 조건식이 맞으면 남길 값을 매우 많이 넣을 수 있습니다.&#x20;





CASE/END 사이에 **WHEN 조건식 THEN 남길값**을 여러개 넣을 수 있는데&#x20;

컴퓨터는 조건식을 위에서 부터 차례차례 실행해보면서

1\. 조건식에 맞을 경우 2. 남길값을 그 자리에 남겨주고 3. CASE 문법을 종료합니다.&#x20;



예를 들어 CARD 테이블에서&#x20;

사용금액이 20만원 이상이면 **'우수고객님'**

사용금액이 10\~20만원이면 **'걍고객'**

사용금액이 10만원 미만이면 **'손놈'**

이렇게 출력하고 싶다면

```sql
SELECT 고객명, 사용금액,
CASE
  WHEN 사용금액 >= 200000 THEN '우수고객님'
  WHEN 사용금액 >= 100000 AND 사용금액 < 200000 THEN '걍고객'
  WHEN 사용금액 < 100000 THEN '손놈' 
END AS 고객평가
FROM CARD; 
```





```sql
CASE 
  WHEN 조건식1 THEN 남길값1
  WHEN 조건식2 THEN 남길값2
  WHEN 조건식3 THEN 남길값3
  ELSE 남길값4
END 
```

ELSE 문법도 가장 마지막 줄에 추가할 수 있는데&#x20;

그럼 조건식들이 전부 맞지 않을 경우 ELSE 우측에 있는 값을 남겨줍니다.&#x20;

&#x20;

```sql
SELECT 고객명, 사용금액,
CASE
  WHEN 사용금액 >= 200000 THEN '우수고객님'
  WHEN 사용금액 >= 100000 THEN '걍고객'
  ELSE '손놈' 
END AS 고객평가
FROM CARD; 
```





집계함수와 같이 사용할 수 있습니다.



**Q1. 등급이 vip인 사람들은 3점, 로열이면 2점, 패밀리면 1점으로 계산해서**&#x20;

**모든 고객의 점수를 다 더하면 몇점일까요?**&#x20;



**Q2. card 테이블에서 장부를 조작하려고 합니다.**

사용금액 30만원 이상은 50% 증액, 30만원 미만은 10% 증액해서

사용금액의 총 합계를 출력해봅시다. 답은 5,147,550로 나오면 정답입니다.&#x20;



**Q3. 고객등급을 재설정하려고 합니다.**

사용금액이 30만원 이상은 'vip'

20만원 이상 30만원 미만은 '로열'

그 외엔 '패밀리'로 다시 설정하려고 합니다.&#x20;

고객등급이 변동될 이름들만 출력해봅시다.&#x20;
