티스토리 뷰

공부 이야기

[SQL] DECODE

판다(panda) 2011. 5. 3. 00:00
쿼리를 공부하고, 사용하면서 가장 많이 쓴.. DECODE..

처음엔.. 단순하게.. 비교만 해서 사용했는데.. 생각을 조금만 하면 더 유용하게 쓸수있더군요..

함수 정의는 이렇습니다..
IF문을 SQL 또는 PL/SQL에 사용하기 위해 존재하는 함수..

제가 생각하기에.. 대충 이런 함수일듯 합니다..
DECODE(테이블.칼럼, 비교 대상, 맞을때(TRUE), 틀릴때(FALSE))

간단하게 예를 들어봅시다..
 칼럼명  칼럼1 칼럼2 
 데이터값  10  20

DECODE(칼럼1, 칼럼1, 'O', 'X') 를 한다면..

칼럼1과 칼럼1 은 같기 때문에.. 맞을때 리턴값인 TRUE 'O' 를 출력합니다..

쿼리를 불러서 출력했을때 ' ' 는 안나오고 O 만 나옵니다.. 이건 다 아시죠;..

DECODE(칼럼1, 칼럼2, 'O', 'X') 를 한다면..

칼럼1 과 칼럼2 는 같지 않기 때문에.. 틀리때 리턴값인 FALSE 'X' 를 출력합니다.

그럼 응용을 살짝 해봅시다..

칼럼 내용이 없을때는 'X'를 표시하고 싶으면 어떻게 해야 할까요?..

DECODE(칼럼1, NULL, 'X', 'O') 를 하면 됩니다.. 간단하죠?..

칼럼1 내용이 없으면 'X'를 있으면 'O'를.. 표시하게 됩니다.. 쉽죠..


지금까지는 칼럼 1개에 대해서 써봤는데요.. 데이터가 여러개 있다면?..

또 간단하게 예를 들어봅시다..
 칼럼명  칼럼1  칼럼2 
 데이터1 값  100  0 
 데이터2 값  80  5
 데이터3 값  50  0

데이터 값이 100 이면 A학점을 80 이면 B학점을 50 이면 F학점을 주고 싶습니다..

"아니 이걸 왜 지금 고쳐!.. 처음부터 A, B, F 로 저장했으면 됐잖아!"..

저는 진짜 처음에 저랬습니다;..

C 스타일로 해보자면 IF( 칼럼1 == "100") PRINT("A"); 이정도가 되겠죠..

하지만 지금은 SQL을 공부하는 시간!..

거기에 오늘 주제는 DECODE!..

DECODE로 해결해야합니다..

DECODE(테이블.칼럼, 비교 대상, 맞을때(TRUE), 틀릴때(FALSE)) 이니까..

DECODE(칼럼1, '100', 'A', NULL) 좋아 하나 해결!..
DECODE(칼럼1, '80', 'B', NULL) 오케이! 쉽다!..
DECODE(칼럼1, '50', 'F', NULL) 이거 별거 아니네..

하고 SELECT 로 값을 출력하면..
 칼럼명  칼럼1  칼럼2  (칼럼1, 100, 'A', NULL)  (칼럼1, 80, 'B', NULL)  (칼럼1, 50, 'F', NULL)
 데이터1 값  100  0  A    
 데이터2 값  80  5    B  
 데이터3 값  50  0      F

이렇게 나와버립니다..

제가 원했던건.. 이런건데 말이지요..
 칼럼명  칼럼1  칼럼2  점수
 데이터1 값  100  0  A
 데이터2 값  80  5  B
 데이터3 값  50  0  F

어떨데 해야 하면 될까요?..

(DECODE(칼럼1, '100', 'A', NULL), DECODE(칼럼1, '80', 'B', NULL), DECODE(칼럼1, '50', 'F', NULL))..
묶어서 한번에?..

사실.. 정확하게.. 코드 설명을 하자면..
외국 사이트에 있는 코드 정의 입니다..
DECODE({column | expression}, search1, result1 [, search2, result2] ... [, default])
DECODE({칼럼 | 표현식}, 조건1, 결과1 [, 조건2, 결과2] ... [, 계속])

위에 있는 정의에 맞춰서 써봅시다..
DECODE(칼럼1, '100', 'A', '80', 'B', '50', 'F') 라고 쓰면..
제가 원하는 테이블 처럼 나오는데..

칼럼명이 DECODE(칼럼1, '100', 'A', '80', 'B', '50', 'F') 이렇게 나옵니다..

점수니까 SCORE 라는 명칭으로 표시하고 싶은데 말이죠..

그럴땐.. 칼럼명 뒤에 명칭을 적어주면 됩니다..

DECODE(칼럼1, '100', 'A', '80', 'B', '50', 'F') AS "SCORE"

또는

DECODE(칼럼1, '100', 'A', '80', 'B', '50', 'F') SCORE

그럼 칼럼명이 깔끔하게 나오는걸 보실 수 있을겁니다..
 칼럼명  칼럼1  칼럼2  SCORE
 데이터1 값  100  0  A
 데이터2 값  80  5  B
 데이터3 값  50  0  F

이 방법들을 응용해서.. 정말 많은 것들을 할 수 있더라구요..

배우면서.. 자꾸 까먹길래 올려봤습니다..