sql 에서 case 문장의 용법 에 대한 간단 한 설명

9714 단어 case문장
SQL 에서 Case 사용 방법
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 로 직접 사용 합 니 다)
국가(국가)인구(인구)
중국
미국 100
캐나다
영국
프랑스 300
일본
독일
멕시코
인도 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 문장 으로 서로 다른 조건 의 그룹 을 완성 합 니 다.
다음 과 같은 데이터 가 있 습 니 다.
국가(국가)성별(성별)인구(인구)
중국
중국
미국
미국
캐나다
캐나다
영국
영국
국가 와 성별 에 따라 조 를 나 누 어 결 과 는 다음 과 같다.
국가 남녀
중국 340 260
미국
캐나다
영국
일반적으로 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,이 회 사 는 여 직원 의 임금 이 반드시 위안 보다 높 아야 한 다 는 규정 이 있 습 니 다.Check 과 Case 로 표현 하면 다음 과 같 습 니 다

CONSTRAINT check_salary CHECK

           ( CASE WHEN sex = '2'

                  THEN CASE WHEN salary > 1000

                        THEN 1 ELSE 0 END

                  ELSE 1 END = 1 )

체크 만 사용 하면 다음 과 같다

CONSTRAINT check_salary CHECK

           ( sex = '2' AND salary > 1000 )

여 직원 의 조건 이 맞 으 면 남 직원 은 입력 할 수 없다.
4.조건 에 따라 선택 한 UPDATE.
예,다음 과 같은 업데이트 조건 이 있 습 니 다.
임금 이상 의 직원,임금 감소
임금 이 중간 에 있 는 직원 은 임금 이 증가 했다.
쉽게 고려 할 수 있 는 것 은 두 번 의 UPDATE 문 구 를 실행 하 는 것 이다.다음 과 같다

--

UPDATE Personnel

SET salary = salary * 0.9

WHERE salary >= 5000;

--

UPDATE Personnel

SET salary = salary * 1.15

WHERE salary >= 2000 AND salary < 4600;

그러나 일 은 생각 보다 간단 하지 않다.개인 임금 이 있다 고 가정 하 자.우선 조건 에 따라 임금 이%줄 어 임금 이 된다.그 다음 에 두 번 째 SQL 을 실 행 했 을 때 이 사람의 월급 은 도착 하 는 범위 내 에서%증가 해 야 하기 때문에 마지막 으로 이 사람의 월급 결 과 는 줄 어 들 기 는 커 녕 오히려 증가 했다.반대로 집행 하면 임금 을 줄 이 는 사람 은 반대로 임금 을 줄 이 는 사람 이 된다.이 규칙 이 아무리 황당 하 더 라 도 SQL 문 구 를 사용 하려 면 Case 함수 가 필요 합 니 다.코드 는 다음 과 같 습 니 다.
여기 서 주의해 야 할 것 은 마지막 줄 의 ELSE salary 가 필요 하 다 는 것 이다.이 줄 이 없 으 면 이 두 가지 조건 에 부합 되 지 않 는 사람의 월급 이 NUll 로 쓰 인 다 면 큰일이다.Case 함수 에서 Else 부분의 기본 값 은 NULL 입 니 다.이 점 은 주의해 야 할 부분 입 니 다.
이런 방법 은 메 인 키 를 변경 하 는 등 여러 곳 에서 도 사용 할 수 있다.
일반적인 상황 에서 두 데이터 의 Primary key,a 와 b 를 교환 하려 면 임시 저장,복사,데 이 터 를 읽 는 세 가지 과정 을 거 쳐 야 한다.Case 함 수 를 사용 하면 모든 것 이 훨씬 간단 해진 다.
p_key col_1 col_2
장 3
이사
왕 오
위 와 같은 데이터 가 있다 고 가정 하면 메 인 키 a 와 b 를 서로 교환 해 야 합 니 다.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;

같은 것 도 유 니 크 키 두 개 를 교환 할 수 있다.주의해 야 할 것 은 메 인 키 를 교환 해 야 하 는 상황 이 발생 하면 대부분 이 표 의 디자인 이 제대로 진행 되 지 않 았 기 때문에 표 의 디자인 이 타당 한 지 검사 하 는 것 을 권장 합 니 다.
다섯,두 표 의 데이터 가 일치 하 는 지 검사 합 니 다.
Case 함 수 는 DECODE 함수 와 다 릅 니 다.Case 함수 에 서 는 BETWEEN,LIKE,IS NULL,IN,EXISTS 등 을 사용 할 수 있 습 니 다.예 를 들 어 IN,EXISTS 를 사용 하면 하위 조 회 를 하여 더 많은 기능 을 실현 할 수 있다.
다음은 두 개의 표 가 있 습 니 다.tblA,tbl_B,두 시계 모두 키 콜 열 이 있 습 니 다.지금 우 리 는 두 개의 시 계 를 비교 합 니 다.tblA 의 키 콜 열 데이터 가 tbl 에 있다 면B 의 키 콜 열 데이터 에서 찾 을 수 있 습 니 다.결 과 를'Matched'로 되 돌려 줍 니 다.찾 지 못 하면 결 과 를'Unmatched'로 되 돌려 줍 니 다.
아래 의 이 기능 을 실현 하려 면 아래 두 문장 을 사용 할 수 있다.
IN 과 EXISTS 를 사용 한 결 과 는 같 았 다.NOT IN 과 NOT EXISTS 를 사용 할 수도 있 지만 이 럴 때 는 NULL 의 상황 에 주의해 야 합 니 다.
6.Case 함수 에서 합계 함 수 를 사용 합 니 다.
다음 표 가 있다 고 가정 해 봐.
학 번(stdid)수업 ID(classid)과정 명(classname)flag(mainclass_flg)
100 1 경제학 Y
100 2 역사학 N
2002 역사학 N
2003 고고학 Y
2004 컴퓨터 N
300 4 컴퓨터 N
400 5 화학 N
500 6 수학 N
몇 과목(100,200)을 동시에 이수 하 는 학생 도 있 고 한 과목(300,400,500)만 선택 하 는 학생 도 있다.여러 과목 을 선택 과목 으로 이수 하 는 학생 은 한 과목 을 전공 으로 하고 flag 에 Y 를 써 야 합 니 다.한 과목 만 선택 한 학생 은 flag 를 N 으로 전공 합 니 다.
지금 우 리 는 아래 두 가지 조건 에 따라 이 표를 조회 해 야 한다.
한 과목 만 수강 한 사람 은 그 과목 의 ID 로 돌아 갑 니 다.
여러 과목 을 선택 과목 으로 이수 한 사람 은 선택 한 주 과정 ID 로 돌아 갑 니 다.
간단 한 생각 은 두 개의 서로 다른 SQL 문 구 를 실행 하여 조회 하 는 것 이다.
조건
실행 결과
STD_ID   MAIN_class
------   ----------
300      4
400      5
500      6
조건
실행 결과
STD_ID  MAIN_class
------  ----------
100     1
200     3
Case 함 수 를 사용 하면 우 리 는 SQL 문 구 를 하나만 사용 하면 문 제 를 해결 할 수 있 습 니 다.구체 적 으로 다음 과 같 습 니 다

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');

실행 결과
STD_ID   MAIN_class
------   ----------
100      1
200      3
300      4
400      5
500      6
Case 함수 에 Case 함 수 를 끼 워 넣 고 합계 함수 에서 Case 함 수 를 사용 하 는 등 방법 을 통 해 우 리 는 이 문 제 를 쉽게 해결 할 수 있 습 니 다.Case 함 수 를 사용 하 는 것 은 우리 에 게 더욱 큰 자 유 를 가 져 다 주 었 다.
마지막 으로 Case 함 수 를 사용 하 는 초보 자 에 게 아래 의 오 류 를 범 하지 않도록 주의 하 라 고 일 깨 워 줍 니 다

-- 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;

이 문장에서 When Null 이라는 줄 은 항상 unknown 으로 돌아 가기 때문에 Wrong 이 영원히 나타 나 지 않 습 니 다.이 구절 은 WHEN col 로 바 꿀 수 있 으 니까 요.1=NULL,이것 은 잘못된 용법 입 니 다.이 럴 때 우 리 는 WHEN col 을 선택해 야 합 니 다.1 IS NULL。

좋은 웹페이지 즐겨찾기