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。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Case swappingCase swapping Description: Given a string, swap the case for each of the letters. e.g. CodEwArs --> cODeWaRS Examples 다른...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.