SQL 조회 중 DECODE 함수 와 CASE WHEN 비교

7610 단어 sqlcasedecodewhen
문장http://xuegao199.iteye.com/blog/1441322
 
1, DECODE 함수
 
그 기본 문법 은 다음 과 같다.
Sql 코드
DECODE(value, if1, then1, if2, then2, if3, then3,...ifn, thenn, else)  
DECODE(value, if1, then1, if2, then2, if3, then3,...ifn, thenn, else)

value 가 if1 과 같 을 때 DECODE 함수 의 결 과 는 then 1 로 되 돌아 가 고, if 값 과 같 지 않 으 면 else 로 되 돌아 가 는 것 을 나타 낸다.즉, decode (조건, 값 1, 번역 값 1, 값 2, 번역 값 2,... 값 n, 번역 값 n, 결 성 값)
확장 방법:
1. sign 함수 와 의 연결 크기 비교:
 
Sql 코드
select decode(sign(arg1-arg2),-1, arg1, arg2) from dual; --get arg1 arg2    
select decode(sign(arg1-arg2),-1, arg1, arg2) from dual; --get arg1 arg2    

Sql 코드
select decode(sign(3-5),1 ,3, 5) from dual  
select decode(sign(3-5),1 ,3, 5) from dual

 주: sign () 함 수 는 특정한 값 이 0, 양수 인지 음수 인지 에 따라 각각 0, 1, - 1 을 되 돌려 줍 니 다.
2. 표, 보기 구조 전환:
기본 사고방식: substrb 함 수 를 사용 하여 필드 에 대한 판단 을 실현 한 다음 에 decode 함수 로 데 이 터 를 다시 계산 하고 새로운 데 이 터 를 생 성하 고 새로운 테이블 (table or view) 을 구성한다.
둘째, 케이스 는
그 문법 은 다음 과 같다.
Sql 코드
SELECT <myColumnSpec> =   
  CASE WHEN <A> THEN <somethingA>   
     WHEN <B> THEN <somethingB>   
     ELSE <somethingE> END     
SELECT <myColumnSpec> = 
  CASE WHEN <A> THEN <somethingA> 
     WHEN <B> THEN <somethingB> 
     ELSE <somethingE> END

selection 에서 CASE 를 사용 할 수 있 는 것 을 제외 하고 where 자구, group by 자구, order by 자구 모두 사용 할 수 있 습 니 다.
Sql 코드
SELECT     CASE           
            WHEN price IS NULL THEN 'Unpriced'           
            WHEN price < 10 THEN 'Bargain'           
            WHEN price BETWEEN 10 and 20 THEN 'Average'           
            ELSE 'Gift to impress relatives'       
           END AS "Range",       
           Title   
FROM titles   
where   
    CASE           
                WHEN price IS NULL THEN 'Unpriced'          
                WHEN price < 10 THEN 'Bargain'           
                WHEN price BETWEEN 10 and 20 THEN 'Average'           
                ELSE 'Gift to impress relatives'     END in('Average','Bargain')  
GROUP BY     CASE           
                WHEN price IS NULL THEN 'Unpriced'           
                WHEN price < 10 THEN 'Bargain'           
                WHEN price BETWEEN 10 and 20 THEN 'Average'           
                ELSE 'Gift to impress relatives'     END,       
                Title   
ORDER BY     CASE           
                WHEN price IS NULL THEN 'Unpriced'           
                WHEN price < 10 THEN 'Bargain'           
                WHEN price BETWEEN 10 and 20 THEN 'Average'           
                ELSE 'Gift to impress relatives'       
                END,Title   
SELECT     CASE         
            WHEN price IS NULL THEN 'Unpriced'         
            WHEN price < 10 THEN 'Bargain'         
            WHEN price BETWEEN 10 and 20 THEN 'Average'         
            ELSE 'Gift to impress relatives'     
           END AS "Range",     
           Title 
FROM titles 
where 
    CASE         
                WHEN price IS NULL THEN 'Unpriced'         
                WHEN price < 10 THEN 'Bargain'         
                WHEN price BETWEEN 10 and 20 THEN 'Average'         
                ELSE 'Gift to impress relatives'     END in('Average','Bargain')
GROUP BY     CASE         
                WHEN price IS NULL THEN 'Unpriced'         
                WHEN price < 10 THEN 'Bargain'         
                WHEN price BETWEEN 10 and 20 THEN 'Average'         
                ELSE 'Gift to impress relatives'     END,     
                Title 
ORDER BY     CASE         
                WHEN price IS NULL THEN 'Unpriced'         
                WHEN price < 10 THEN 'Bargain'         
                WHEN price BETWEEN 10 and 20 THEN 'Average'         
                ELSE 'Gift to impress relatives'     
                END,Title

rm_site_master 표 구조:
rma_center | name
---------------------------
123              |qw
23                |ASde
45                |sssdf
55                |e3fbg
55555          |adfv
22221          |sdfsfe
4                  |sdfeg
579              |lojgdex

 
 
 
Sql 코드
select name,  
       CASE           
        WHEN rma_center IS NULL THEN 'Null'           
        WHEN rma_center > 1000 THEN '>1000'           
        WHEN rma_center BETWEEN 30 and 100 THEN '30~100'           
        ELSE 'Gift to impress relatives'     END  AS "RMA CENTER Type"                      
from rm_site_master   
where  CASE           
        WHEN rma_center IS NULL THEN 'Null'           
        WHEN rma_center > 1000 THEN '>1000'           
        WHEN rma_center BETWEEN 30 and 100 THEN '30~100'           
        ELSE 'Gift to impress relatives'     END in('30~100','>1000')  
group by CASE           
        WHEN rma_center IS NULL THEN 'Null'           
        WHEN rma_center > 1000 THEN '>1000'           
        WHEN rma_center BETWEEN 30 and 100 THEN '30~100'           
        ELSE 'Gift to impress relatives'     END,  
        name  
order by CASE           
        WHEN rma_center IS NULL THEN 'Null'           
        WHEN rma_center > 1000 THEN '>1000'           
        WHEN rma_center BETWEEN 30 and 100 THEN '30~100'           
        ELSE 'Gift to impress relatives'     END,  
        name  
select name,
       CASE         
        WHEN rma_center IS NULL THEN 'Null'         
        WHEN rma_center > 1000 THEN '>1000'         
        WHEN rma_center BETWEEN 30 and 100 THEN '30~100'         
        ELSE 'Gift to impress relatives'     END  AS "RMA CENTER Type"                    
from rm_site_master 
where  CASE         
        WHEN rma_center IS NULL THEN 'Null'         
        WHEN rma_center > 1000 THEN '>1000'         
        WHEN rma_center BETWEEN 30 and 100 THEN '30~100'         
        ELSE 'Gift to impress relatives'     END in('30~100','>1000')
group by CASE         
        WHEN rma_center IS NULL THEN 'Null'         
        WHEN rma_center > 1000 THEN '>1000'         
        WHEN rma_center BETWEEN 30 and 100 THEN '30~100'         
        ELSE 'Gift to impress relatives'     END,
        name
order by CASE         
        WHEN rma_center IS NULL THEN 'Null'         
        WHEN rma_center > 1000 THEN '>1000'         
        WHEN rma_center BETWEEN 30 and 100 THEN '30~100'         
        ELSE 'Gift to impress relatives'     END,
        name

 
3. DECODE 와 CASE WHEN 의 비교
 1,DECODE  Oracle 특유; 2,CASE WHEN  Oracle ,  SQL Server,  MySQL 모두 사용 가능;3. DECODE 는 똑 같은 판단 만 할 수 있 지만 sign 함수 에 맞추어 크 고 작 으 며 같은 판단 을 할 수 있 습 니 다. CASE 는 =, > =, <, < =, < >, is null, is not null 등의 판단 에 사용 할 수 있 습 니 다.
 4. DECODE 는 간결 하 게 사용 하고 CASE 는 복잡 하지만 유연성 이 있 습 니 다.

좋은 웹페이지 즐겨찾기