Flow control (IF/CASE) ใน Mysql
Flow control ใน Mysql
อ้างอิงจาก http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html
คืออะไร? ทำไมต้องใช้?
บางครั้งแม้มันจะง่ายและเร็วกว่า ที่จะทำส่วนคำนวณใน Php ก่อนแล้วค่อยมาทำ Query ใน Mysql แต่ในบางกรณีเล็กๆน้อย หรือบางครั้งที่ต้องการการ Customize โดยไม่ต้องเขียนโค้ดเพิ่ม การเขียน IF/Case เข้าไปใน Mysql ก็สร้างความสะดวกได้มาก
IF(expr1,expr2,expr3)
If expr1 is TRUE (expr1 <> 0 and expr1 <> NULL) then IF() returns expr2; otherwise it returns expr3. IF() returns a numeric or string value, depending on the context in which it is used.
mysql> SELECT IF(1>2,2,3); -> 3
mysql> SELECT IF(1<2,’yes’,'no’); -> ‘yes’
mysql> SELECT IF(STRCMP(’test’,'test1′),’no’,'yes’); -> ‘no’
เป็น IF แบบอย่างง่าย โดยจะมี 3 parameter คือ
- expr1 = Condition โดยให้ใส่เป็นเงื่อนไขต่างๆเช่น a>1 , b < a หรืออื่นๆ ที่ return ค่าเป็น boolean (true/false)
- expr2 = จะทำงานเป็น Condition เป็น true โดย Function IF จะ return ค่า expr2 กลับมา
- expr3 = จะทำงานเป็น Condition เป็น false โดย Function IF จะ return ค่า expr3 กลับมา
โดย IF แบบนี้ จะใช้งานเหมือนกับ Function ทั่วไปเลย ซึ่งข้อเสียคือทำให้ทำ Nested If (If หลายๆเงื่อนไข) ค่อนข้างลำบาก
CASE
CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result …] [ELSEresult] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result …] [ELSE result] END
mysql> SELECT CASE 1 WHEN 1 THEN ‘one’
-> WHEN 2 THEN ‘two’ ELSE ‘more’ END;
-> ‘one’
mysql> SELECT CASE WHEN 1>0 THEN ‘true’ ELSE ‘false’ END;
-> ‘true’
mysql> SELECT CASE BINARY ‘B’
-> WHEN ‘a’ THEN 1 WHEN ‘b’ THEN 2 END;
-> NULL
Case ของ Mysql จะต่างกับ IF ตรงที่ดูเป็นโครงสร้างภาษา ไม่ใช่เป็น Function
โดยรูปแบบจะเหมือนกับ Switch/Select ของภาษาอื่น คือ จะเข้า Case เมื่อ value/condition มีค่าเท่ากับ compare_value
Trick สำหรับการทำ IF เงื่อนไขแบบเป็นช่วง สามารถดัดแปลงใช้ CASE ช่วยได้
Ex.
(CASE TRUE WHEN point_all<20 THEN 1 WHEN point_all<100 THEN 2 WHEN point_all<500 THEN 3 WHEN point_all<5000 THEN 4 ELSE 5 END) as point_all_lv,
โดยหลักการก็ง่ายๆ ให้ Value ตั้งต้นเป็น TRUE และ ใน WHEN ก็ใส่เป็น Condition ไปแทน ทีนี้เราก็ได้ IF ที่น่าตาอ่านง่ายกว่าแบบ Function
ไม่มีความคิดเห็น:
แสดงความคิดเห็น