天天看點

case ... when ... then ... else ... end 的使用經曆

根據以下兩個表:

     * 資料表:

case ... when ... then ... else ... end 的使用經曆

     * 标準劃分表:

case ... when ... then ... else ... end 的使用經曆

需求:

     根據‘資料表’中的各項的資料,查詢得到相對應的劃分标準。在‘标準劃分表’中,資料<min_value顯示為‘正常’,在max_value和min_value之間的資料,顯示相對應的item_tips字段内容。

    最開始不了解case ... when ... then ...else ... end語句中是否可以嵌套複雜的if  ... elseif ... end if語句,是以寫成了“方式一”的樣子,然後提示ELSEIF處發生錯誤,也就是不能使用該語句。然後改成了“方式二”的樣子。

        方式一:

min_min_value_3,   // 當item_type = 3 時,min_value列的最小值
max_min_value_3,   // 當item_type = 3 時,min_value列的最大值
max(
	CASE
            s.item_type 
	WHEN 3 
        THEN
	    IF(pm25 >= min_min_value_3 AND pm25 < max_min_value_3,s.item_tips)
            ELSEIF(pm25 < min_min_value_3,'正常' )
            ELSEIF(pm25 > max_min_value_3,'超标' )
            END IF 
        ELSE 0 
        END ) pm25_tip,
           

        方式二: 

SELECT
	d.id,
	device_id,
	temperature,
	humidity,
	d.create_time,
	d.update_time,
	d.create_by,
	methanal,
	max( CASE s.item_type WHEN 1 THEN IF ( methanal >= s.min_value, s.item_tips, '正常' ) ELSE 0 END ) methanal_tip,
	co2,
	max( CASE s.item_type WHEN 2 THEN IF ( co2 >= s.min_value, s.item_tips, '正常' ) ELSE 0 END ) co2_tip,
	pm25,
	max(
	CASE
            s.item_type 
	WHEN 3 
            THEN
		IF(pm25 >= s.min_value AND pm25 <= s.max_value,s.item_tips,IF( pm25 < s.min_value, '正常', '超标' ) ) 
            ELSE 0 
            END ) pm25_tip,
	tvoc,
	max( CASE s.item_type WHEN 4 THEN IF ( tvoc >= s.min_value, s.item_tips, '正常' ) ELSE 0 END ) tvoc_tip 
	FROM
	    aircleaner_data d
	    JOIN 
            aircleaner_standard s 
	GROUP BY
		d.id 
ORDER BY
	create_time DESC