SQL 의 case when then else end 사용법
-- 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. 예, 다음 과 같은 업데이트 조건 이 있 습 니 다.
-- 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
왕 오
상기 데이터 가 있다 고 가정 하면 메 인 키
a
와 b
를 서로 교환 해 야 한다.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 으로 전공 한다.。 지금 우 리 는 아래 두 가지 조건 에 따라 이 표를 조회 해 야 한다.
간단 한 생각 은 두 개의 서로 다른 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.