SQL 의 case when then else end 사용법

Case 는 두 가지 형식 을 가지 고 있 습 니 다.간단 한 Case 함수 와 Case 검색 함수.
--  Case  
CASE sex
         WHEN '1' THEN ' '
         WHEN '2' THEN ' '
ELSE '  ' END
--Case    
CASE WHEN sex = '1' THEN ' '
         WHEN sex = '2' THEN ' '
ELSE '  ' END

이 두 가지 방식 은 같은 기능 을 실현 할 수 있다.간단 한 Case 함수 의 작성 방법 은 상대 적 으로 간결 하지만 Case 검색 함수 에 비해 기능 적 으로 제한 이 있 습 니 다. 예 를 들 어 판단 식 을 쓰 는 것 입 니 다. 또 주의해 야 할 문제 가 있 습 니 다. Case 함 수 는 첫 번 째 조건 에 맞 는 값 만 되 돌려 주 고 나머지 Case 부분 은 자동 으로 무 시 됩 니 다. 
--   ,    SQL,       “   ”    
CASE WHEN col_1 IN ( 'a', 'b') THEN '   '
         WHEN col_1 IN ('a')       THEN '   '
ELSE'  ' END

Case 함 수 를 사용 하면 어떤 일 을 할 수 있 는 지 살 펴 보 겠 습 니 다. 1. 이미 알 고 있 는 데 이 터 는 다른 방식 으로 그룹 을 나 누 어 분석 합 니 다. 다음 과 같은 데이터 가 있 습 니 다. (더 잘 보이 기 위해 저 는 국가 코드 를 사용 하지 않 고 국가 이름 을 Primary Key 로 직접 사용 합 니 다) 
국가 (국가)
인구 (인구)
중국.
600
미국.
100
캐나다
100
영국.
200
프랑스
300
일본.
250
독일.
200
멕시코
50
인도.
250
이 나라 의 인구 데이터 에 따 르 면 아시아 와 북 미의 인구 수 를 통계 한다.아래 의 이 결 과 를 얻어 야 한다. 
주.
인구
아시아의
1100
북 미
250
기타
700
이 문 제 를 해결 하려 면 어떻게 하 시 겠 습 니까?주 코드 가 있 는 View 를 만 드 는 것 은 해결 방법 이지 만 통 계 를 동태 적 으로 바 꾸 기 어렵다. Case 함 수 를 사용 하면 SQL 코드 는 다음 과 같 습 니 다.
SELECT  SUM(population),
        CASE country
                WHEN '  '     THEN '  '
                WHEN '  '     THEN '  '
                WHEN '  '     THEN '  '
                WHEN '  '     THEN '   '
                WHEN '   '  THEN '   '
                WHEN '   '  THEN '   '
        ELSE '  ' END
FROM    Table_A
GROUP BY CASE country
                WHEN '  '     THEN '  '
                WHEN '  '     THEN '  '
                WHEN '  '     THEN '  '
                WHEN '  '     THEN '   '
                WHEN '   '  THEN '   '
                WHEN '   '  THEN '   '
        ELSE '  ' END;

마찬가지 로 우 리 는 이 방법 으로 임금 의 등급 을 판단 하고 각 등급 의 인원 을 통계 할 수 있다.SQL 코드 는 다음 과 같 습 니 다. 
SELECT
        CASE WHEN salary <= 500 THEN '1'
             WHEN salary > 500 AND salary <= 600  THEN '2'
             WHEN salary > 600 AND salary <= 800  THEN '3'
             WHEN salary > 800 AND salary <= 1000 THEN '4'
        ELSE NULL END salary_class,
        COUNT(*)
FROM    Table_A
GROUP BY
        CASE WHEN salary <= 500 THEN '1'
             WHEN salary > 500 AND salary <= 600  THEN '2'
             WHEN salary > 600 AND salary <= 800  THEN '3'
             WHEN salary > 800 AND salary <= 1000 THEN '4'
        ELSE NULL END;

둘째, 하나의 SQL 문장 으로 서로 다른 조건 의 그룹 을 완성 합 니 다. 다음 과 같은 데이터 가 있 습 니 다. 
국가 (국가)
성별 (성별)
인구 (인구)
중국.
1
340
중국.
2
260
미국.
1
45
미국.
2
55
캐나다
1
51
캐나다
2
49
영국.
1
40
영국.
2
60
국가 와 성별 에 따라 조 를 나 누 어 결 과 는 다음 과 같다. 
나라.
남자.
여자.
중국.
340
260
미국.
45
55
캐나다
51
49
영국.
40
60
일반적으로 UNION 으로 도 하나의 문구 로 조회 가 가능 하 다.하지만 그렇게 소모 (두 개의 Select 부분) 를 늘 리 고 SQL 문 구 는 비교적 길다. 다음은 Case 함수 로 이 기능 을 완성 한 예 입 니 다. 
SELECT country,
       SUM( CASE WHEN sex = '1' THEN 
                      population ELSE 0 END),  --    
       SUM( CASE WHEN sex = '2' THEN 
                      population ELSE 0 END)   --    
FROM  Table_A
GROUP BY country;

이렇게 해서 우 리 는 Select 를 사용 하여 2 차원 표 에 대한 출력 형식 을 완성 하여 Case 함수 의 강 함 을 충분히 나 타 냈 다. 3. Check 에서 Case 함 수 를 사용 합 니 다. Check 에서 Case 함 수 를 사용 하 는 것 은 많은 경우 에 매우 좋 은 해결 방법 입 니 다.Check 을 전혀 사용 하지 않 는 사람 이 많 을 수도 있 습 니 다. 그러면 다음 의 예 를 본 후에 도 SQL 에서 Check 을 사용 해 보 는 것 을 권장 합 니 다. 다음은 저희 가 예 를 들 어 보 겠 습 니 다. 회사 A, 이 회 사 는 여 직원 의 임금 이 1000 위안 을 넘 어야 한 다 는 규정 이 있 습 니 다.Check 과 Case 로 표현 하면 다음 과 같 습 니 다.
CONSTRAINT check_salary CHECK
           ( CASE WHEN sex = '2'
                  THEN CASE WHEN salary > 1000
                        THEN 1 ELSE 0 END
                  ELSE 1 END = 1 )

Check 만 사용 하면 다음 과 같 습 니 다. 
CONSTRAINT check_salary CHECK
           ( sex = '2' AND salary > 1000 )

여 직원 의 조건 이 맞 으 면 남자 직원 은 입력 할 수 없다.
4. 조건 에 따라 선택 한 UPDATE. 예, 다음 과 같은 업데이트 조건 이 있 습 니 다.
  • 급여 5000 이상 직원, 급여 10% 감소
  • 월급 이 2000 에서 4600 사이 인 직원 은 월급 이 15% 증가
  • 두 번 의 UPDATE 문 구 를 실행 하 는 것 을 선택 하 는 것 은 다음 과 같다. 
    --  1
    UPDATE Personnel
    SET salary = salary * 0.9
    WHERE salary >= 5000;
    --  2
    UPDATE Personnel
    SET salary = salary * 1.15
    WHERE salary >= 2000 AND salary < 4600;
    

    하지만 생각 만큼 간단 하지 않다. 개인 임금 5000 원 이 있다 고 가정 해 보 자.우선 조건 1 에 따라 임금 이 10% 줄 어 4500 원 이 된다.이 어 두 번 째 SQL 을 운영 할 때 이 사람의 임금 은 4500 에서 2000 에서 4600 범위 내 에서 15% 증가 해 야 하기 때문에 마지막 으로 이 사람의 임금 결 과 는 5175 로 줄 어 들 기 는 커 녕 오히려 증가 했다.반대로 집행 하면 임금 4600 명 은 반대로 임금 삭감 으로 바뀐다.이 규칙 이 아무리 황당 하 더 라 도 SQL 문 구 를 사용 하려 면 Case 함수 가 필요 합 니 다.코드 는 다음 과 같 습 니 다: 
    UPDATE Personnel
    SET salary = CASE WHEN salary >= 5000
                 THEN salary * 0.9
    WHEN salary >= 2000 AND salary < 4600
    THEN salary * 1.15
    ELSE salary END;
    

    여기 서 주의해 야 할 것 은 마지막 줄 의 ELSE salary 가 필요 하 다 는 것 이다. 이 줄 이 없 으 면 이 두 가지 조건 에 부합 되 지 않 는 사람의 월급 이 NUll 로 쓰 인 다 면 큰일이다.Case 함수 에서 Else 부분의 기본 값 은 NULL 입 니 다. 이 점 은 주의해 야 할 부분 입 니 다. 이런 방법 은 메 인 키 를 변경 하 는 등 여러 곳 에서 도 사용 할 수 있다. 일반적인 상황 에서 두 데이터 의 Primary key, a 와 b 를 교환 하려 면 임시 저장, 복사, 데 이 터 를 읽 는 세 가지 과정 을 거 쳐 야 한다. Case 함 수 를 사용 하면 모든 것 이 훨씬 간단 해진 다. 
    p_key
    col_1
    col_2
    a
    1
    장삼
    b
    2
    이사
    c
    3
    왕 오
    상기 데이터 가 있다 고 가정 하면 메 인 키 ab 를 서로 교환 해 야 한다.Case 함수 로 이 루어 지면 코드 는 다음 과 같 습 니 다. 
     
    UPDATE SomeTable
    SET p_key = CASE WHEN p_key = 'a'
    THEN 'b'
    WHEN p_key = 'b'
    THEN 'a'
    ELSE p_key END
    WHERE p_key IN ('a', 'b');
    

    같은 것 도 유 니 크 키 두 개 를 교환 할 수 있다.주의해 야 할 것 은 메 인 키 를 교환 해 야 하 는 상황 이 발생 하면 대부분 이 표 의 디자인 이 제대로 진행 되 지 않 았 기 때문에 표 의 디자인 이 타당 한 지 검사 하 는 것 을 권장 합 니 다. 다섯, 두 표 의 데이터 가 일치 하 는 지 검사 합 니 다. Case 함 수 는 DECODE 함수 와 다 릅 니 다.Case 함수 에 서 는 BETWEEN, LIKE, IS NULL, IN, EXISTS 등 을 사용 할 수 있 습 니 다.예 를 들 어 IN, EXISTS 를 사용 하면 하위 조 회 를 하여 더 많은 기능 을 실현 할 수 있다. 다음은 두 개의 표 가 있 습 니 다. tblA,tbl_B, 두 시계 모두 키 콜 열 이 있 습 니 다.지금 우 리 는 두 개의 시 계 를 비교 합 니 다. tblA 의 키 콜 열 데이터 가 tbl 에 있다 면B 의 키 콜 열 데이터 에서 찾 을 수 있 습 니 다. 결 과 를 'Matched' 로 되 돌려 줍 니 다. 찾 지 못 하면 결 과 를 'Unmatched' 로 되 돌려 줍 니 다. 아래 의 이 기능 을 실현 하려 면 아래 의 두 문장 을 사용 할 수 있다 
    --  IN   
    SELECT keyCol,
    CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B )
    THEN 'Matched'
    ELSE 'Unmatched' END Label
    FROM tbl_A;
    --  EXISTS   
    SELECT keyCol,
    CASE WHEN EXISTS ( SELECT * FROM tbl_B
    WHERE tbl_A.keyCol = tbl_B.keyCol )
    THEN 'Matched'
    ELSE 'Unmatched' END Label
    FROM tbl_A;
    

    IN 과 EXISTS 를 사용 한 결 과 는 같 았 다.NOT IN 과 NOT EXISTS 를 사용 할 수도 있 지만 이 럴 때 는 NULL 의 상황 에 주의해 야 합 니 다. 6. Case 함수 에서 합계 함 수 를 사용 합 니 다. 다음 표 가 있다 고 가정 해 봐.
    학 번 (std id)
    수업 ID (class id)
    수업 명 (class name)
    flag 전공 (main class flg)
    100
    1
    경제학
    Y
    100
    2
    역사학
    N
    200
    2
    역사학
    N
    200
    3
    고고학
    Y
    200
    4
    컴퓨터.
    N
    300
    4
    컴퓨터.
    N
    400
    5
    화학
    N
    500
    6
    수학.
    N
    몇 과목 (100, 200) 을 동시에 이수 하 는 학생 도 있 고, 한 과목 (300, 400, 500) 만 선택 하 는 학생 도 있다. 여러 과목 을 선택 한 학생 은 한 과목 을 전공 으로 하고, flag 에 Y 를 전공 해 야 한다. 한 과목 만 선택 한 학생 은 flag 을 N 으로 전공 한다.。 지금 우 리 는 아래 두 가지 조건 에 따라 이 표를 조회 해 야 한다.
     
  • 한 과목 만 선택 과목 으로 이수 한 사람 은 그 과목 의 ID
  • 로 돌아 갑 니 다.
  • 여러 과목 을 선택 과목 으로 이수 한 사람 은 선택 한 주 과정 ID
  • 로 돌아 갑 니 다.
    간단 한 생각 은 두 개의 서로 다른 SQL 문 구 를 실행 하여 조회 하 는 것 이다. 조건 
    --  1:           
    SELECT std_id, MAX(class_id) AS main_class
    FROM Studentclass
    GROUP BY std_id
    HAVING COUNT(*) = 1;
    

    실행 결과 1 
    STD_ID   MAIN_class
    ------   ----------
    300      4
    400      5
    500      6
    

    조건 2 
    --  2:         
    SELECT std_id, class_id AS main_class
    FROM Studentclass
    WHERE main_class_flg = 'Y' ;
    

    실행 결과 2 
    STD_ID  MAIN_class
    ------  ----------
    100     1
    200     3
    

    Case 함 수 를 사용 하면 우 리 는 SQL 문 구 를 하나만 사용 하면 문 제 를 해결 할 수 있 습 니 다. 구체 적 으로 다음 과 같 습 니 다. 
    SELECT  std_id,
    CASE WHEN COUNT(*) = 1  --             
    THEN MAX(class_id)
    ELSE MAX(CASE WHEN main_class_flg = 'Y'
    THEN class_id
    ELSE NULL END
    )
    END AS main_class
    FROM Studentclass
    GROUP BY std_id;
    

    실행 결과 
    STD_ID   MAIN_class
    ------   ----------
    100      1
    200      3
    300      4
    400      5
    500      6
    

    Case 함수 에 Case 함 수 를 끼 워 넣 고 합계 함수 에서 Case 함 수 를 사용 하 는 등 방법 을 통 해 우 리 는 이 문 제 를 쉽게 해결 할 수 있 습 니 다. Case 함 수 를 사용 하여 우리 에 게 더욱 큰 자 유 를 가 져 다 주 었 습 니 다. 마지막 으로 Case 함 수 를 사용 하 는 초보 자 에 게 아래 의 오 류 를 범 하지 않도록 주의 하 라 고 일 깨 워 주세요. 
    CASE col_1
    WHEN 1        THEN 'Right'
    WHEN NULL  THEN 'Wrong'
    END
    

    이 구문 에서 When Null 줄 은 항상 unknown 으로 되 돌아 가기 때문에 잘못된 상황 은 영원히 발생 하지 않 습 니 다. WHEN col 1 = NULL 로 바 꿀 수 있 기 때문에 잘못된 용법 입 니 다. 이 럴 때 우 리 는 WHEN col 1 IS NULL 을 선택해 야 합 니 다.
    다음으로 전송:https://www.cnblogs.com/kungfupanda/p/4255661.html

    좋은 웹페이지 즐겨찾기