CASE WHEN 상세 정보 + 인스턴스

때때로 데이터베이스에 저장 공간의 절약을 위해 비교적 작은 필드를 저장하는데 이것은 select 문장에서 전환할 수 있다.
 
select 문장에 조건 문장을 사용합니다: 만약 데이터베이스에 있는 한 필드Gender로 성별을 저장한다면 1/0 두 개의 값을 저장할 수 있습니다. 이 때 selectcasewhen gender = 1 then'Man'else'Woman'endas [gender] from Person Info
 
SQL CASE 표현식은 다른 언어의 if/else 문과 유사한 일반적인 조건 표현식입니다.
CASE WHEN condition THEN result
     [WHEN ...]
     [ELSE result]
END

CASE 자문은 표현식이 유효하게 존재할 수 있는 모든 곳에 사용할 수 있습니다.condition은 boolean을 되돌려 주는 표현식입니다.만약 결과가 진실이라면, CASE 표현식의 결과는 조건에 부합되는result이다.만약 결과가 가짜라면, 다음 WHEN 자구를 같은 방식으로 검색하십시오.만약 WHEN condition이 진실이 아니라면,case 표현식의 결과는 ELSE 자구의 값입니다.ELSE 자구가 생략되고 일치하는 조건이 없으면 결과는 NULL입니다.
예:
SELECT * FROM test;

 a
---
 1
 2
 3


SELECT a,
       CASE WHEN a=1 THEN 'one'
	    WHEN a=2 THEN 'two'
	    ELSE 'other'
       END
    FROM test;

 a | case
---+-------
 1 | one
 2 | two
 3 | other

모든result 표현식 데이터의 형식은 단일한 출력 형식으로 변환될 수 있어야 합니다.
아래의 이'간단한'CASE 표현식은 위의 통용적인 형식의 특수한 변종이다.
CASE expression
    WHEN value THEN result
    [WHEN ...]
    [ELSE result]
END

먼저 expression의 값을 계산한 다음, WHEN 자구에 표시된value와 같은 값을 찾을 때까지 비교합니다.일치하는 것을 찾지 못하면 ELSE 자문에 있는 Result (또는 NULL) 를 되돌려줍니다.이것은 C의 switch 문장과 유사하다.
위의 예는 간단한 CASE 구문으로 작성할 수 있습니다.
SELECT a,
       CASE a WHEN 1 THEN 'one'
	      WHEN 2 THEN 'two'
	      ELSE 'other'
       END
    FROM test;

 a | case
---+-------
 1 | one
 2 | two
 3 | other

CASE 표현식은 결과를 판단하는 데 필요하지 않은 하위 표현식을 계산하지 않습니다.예를 들어, 다음은 제로를 피할 수 있는 방법입니다.
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

원본 주소:http://blog.csdn.net/jiwenyi163/article/details/2794038
다음은 케이스 when 예입니다.
SELECT     dbo.FM_InHospital_Fee.EMPI_ID AS p_main_id, dbo.FM_InHospital_Fee.Inhosp_No AS p_settlement_code, dbo.FM_InHospital_Fee.Pat_Name AS p_name, 
                      dbo.PA_Patient_Information.Sex_Name AS p_sex, dbo.FM_InHospital_Fee.Inhosp_Index_No AS p_admit_id, 
                      dbo.PA_Inhospital_Registration.MR_No AS p_medical_record_id, dbo.FM_InHospital_Fee.Curr_Dept_Code AS p_admit_dept_code, 
                      dbo.FM_InHospital_Fee.Curr_Dept_Name AS p_admit_dept_name, dbo.PA_Inhospital_Registration.Admit_Bed_No AS p_admit_bed_no, 
                      dbo.PA_Inhospital_Registration.Admit_Date AS p_admit_date, dbo.PA_Inhospital_Registration.Discharge_Date AS p_discharge_date, '' AS p_admit_days, 
                      dbo.FM_InHospital_Fee.Medicare_Categ_Name AS p_medicare_type, dbo.PA_Patient_Information.HC_No AS p_social_security_id, 
                      dbo.FM_InHospital_Fee.Charge_Date AS p_settlement_date, dbo.FM_InHospital_Fee.Settlement_Staff_Name AS p_settlement_person, '' AS p_personal_fee, 
                      '' AS p_medicare_fund_payment, '' AS p_accept_fee, '' AS p_pay_fee, '' AS p_expect_fee, CASE WHEN Charge_Item_Code = 'BILL03' THEN 'Receivable_Fee' ELSE NULL
                       END AS p_western_medicine_fee, CASE WHEN Charge_Item_Code = 'BILL04' THEN 'Receivable_Fee' ELSE NULL END AS p_chinese_patent_medicine_fee, 
                      CASE WHEN Charge_Item_Code = 'BILL05' THEN 'Receivable_Fee' ELSE NULL END AS p_chinese_herbal_medicine_fee, 
                      CASE WHEN Charge_Item_Code = 'BILL06' THEN 'Receivable_Fee' ELSE NULL END AS p_inspect_fee, 
                      CASE WHEN Charge_Item_Code = 'BILL08' THEN 'Receivable_Fee' ELSE NULL END AS p_irradiation_fee, 
                      CASE WHEN Charge_Item_Code = 'BILL10' THEN 'Receivable_Fee' ELSE NULL END AS p_assay_fee, 
                      CASE WHEN Charge_Item_Code = 'BILL07' THEN 'Receivable_Fee' ELSE NULL END AS p_treatment_fee, 
                      CASE WHEN Charge_Item_Code = 'BILL09' THEN 'Receivable_Fee' ELSE NULL END AS p_operation_fee, 
                      CASE WHEN Charge_Item_Code = 'BILL11' THEN 'Receivable_Fee' ELSE NULL END AS p_oxygen_therapy_fee, 
                      CASE WHEN Charge_Item_Code = 'BILL01' THEN 'Receivable_Fee' ELSE NULL END AS p_medical_fee, 
                      CASE WHEN Charge_Item_Code = 'BILL02' THEN 'Receivable_Fee' ELSE NULL END AS p_bed_fee, 
                      CASE WHEN Charge_Item_Code = 'BILL12' THEN 'Receivable_Fee' ELSE NULL END AS p_other_fee, '' AS p_material_fee, '' AS p_intensive_care_fee, 
                      '' AS p_transfusion_fee, '' AS p_nurse_fee, dbo.FM_InHospital_Fee.Total_Fee AS p_add_fee
FROM         dbo.FM_InHospital_Fee INNER JOIN
                      dbo.PA_Patient_Information ON dbo.FM_InHospital_Fee.EMPI_ID = dbo.PA_Patient_Information.EMPI_ID INNER JOIN
                      dbo.PA_Inhospital_Registration ON dbo.FM_InHospital_Fee.EMPI_ID = dbo.PA_Inhospital_Registration.EMPI_ID

좋은 웹페이지 즐겨찾기