SWITCH เป็นฟังก์ชันตรรมชาติสำหรับจัดการหลายกรณี ช่วยให้หลีกเลี่ยง IF ซ้อนหลายชั้น และสามารถใช้รูปแบบ SWITCH(TRUE()) ได้ สำหรับเงื่อนไขแบบช่วง (>=, <=) หรือเงื่อนไขซับซ้อน
=SWITCH(<expression>, <value1>, <result1>[, <value1>, <result1>]...[, <else>])
=SWITCH(<expression>, <value1>, <result1>[, <value1>, <result1>]...[, <else>])
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| expression | Scalar | Yes | นิพจน์หรือค่าที่ต้องการนำไปเทียบกับรายการ value สามารถเป็น column reference, measure, SELECTEDVALUE(), หรือนิพจน์อื่น ในกรณี SWITCH(TRUE()) ให้ใส่ TRUE() ที่นี่ | |
| value1 | Scalar | Yes | ค่าแรกที่ต้องการจับคู่กับ expression หรือ boolean expression (สำหรับ SWITCH(TRUE())) | |
| result1 | Scalar | Yes | ผลลัพธ์ที่ต้องการคืนหากเข้าเงื่อนไขแรก สามารถเป็นข้อความ, ตัวเลข, measure reference ก็ได้ | |
| else | Scalar | Optional | BLANK() | ค่าเริ่มต้นที่ส่งกลับเมื่อไม่เข้าเงื่อนไขใดเลย ถ้าไม่ระบุ SWITCH จะคืน BLANK() |
เปลี่ยนรหัส/ตัวเลือกให้เป็นข้อความที่อ่านง่ายเพื่อแสดงในรายงาน
แบ่งผลลัพธ์เป็นหลายระดับ เช่น A/B/C หรือ Low/Medium/High โดยไม่ต้องซ้อน IF หลายชั้น
ใช้ SELECTEDVALUE อ่านตัวเลือกจาก Slicer แล้วให้ SWITCH คืนผลลัพธ์ตามตัวเลือกนั้น
Month Name = SWITCH( Sales[MonthNumber], 1, "January", 2, "February", 3, "March", 4, "April", 5, "May", 6, "June", 7, "July", 8, "August", 9, "September", 10, "…Month Name =
SWITCH(
Sales[MonthNumber],
1, "January",
2, "February",
3, "March",
4, "April",
5, "May",
6, "June",
7, "July",
8, "August",
9, "September",
10, "October",
11, "November",
12, "December",
"Invalid Month"
)
ถ้า MonthNumber = 3 จะคืน "March"
Customer Tier = SWITCH( TRUE(), SUM(Sales[Amount]) >= 1000000, "Platinum", SUM(Sales[Amount]) >= 500000, "Gold", SUM(Sales[Amount]) >= 100000, "Silver", "Bronze…Customer Tier =
SWITCH(
TRUE(),
SUM(Sales[Amount]) >= 1000000, "Platinum",
SUM(Sales[Amount]) >= 500000, "Gold",
SUM(Sales[Amount]) >= 100000, "Silver",
"Bronze"
)
ถ้ายอดขาย >= 1,000,000 จะคืน "Platinum"
KPI Value = VAR SelectedMetric = SELECTEDVALUE(Metrics[MetricName], "Sales") RETURN SWITCH( SelectedMetric, "Sales", [Total Sales], "Profit", [Total Profit], "Q…KPI Value =
VAR SelectedMetric = SELECTEDVALUE(Metrics[MetricName], "Sales")
RETURN
SWITCH(
SelectedMetric,
"Sales", [Total Sales],
"Profit", [Total Profit],
"Quantity", [Total Quantity],
"Margin", [Profit Margin],
[Total Sales]
)
ถ้าสลับ Slicer เป็น "Profit" จะแสดง [Total Profit]
Risk Assessment = VAR DaysOverdue = TODAY() - Orders[DueDate] VAR OrderAmount = Orders[Amount] RETURN SWITCH( TRUE(), DaysOverdue > 60 OR OrderAmount > 50000, "…Risk Assessment =
VAR DaysOverdue = TODAY() - Orders[DueDate]
VAR OrderAmount = Orders[Amount]
RETURN
SWITCH(
TRUE(),
DaysOverdue > 60 OR OrderAmount > 50000, "Critical",
DaysOverdue > 30 AND OrderAmount > 10000, "High",
DaysOverdue > 0, "Medium",
"Low"
)
ถ้า DaysOverdue > 60 หรือ Amount > 50K จะคืน "Critical"
IF เหมาะสำหรับเงื่อนไขตัวเดียวหรือสองตัว แต่ SWITCH ใช้ดีกว่าเมื่อมี 3+ กรณี โค้ด SWITCH อ่านง่ายกว่า เหน็บความตั้งใจ ไม่ต้องเปิด-ปิดวงเล็บวุ่นวาย
SWITCH ปกติ: จับคู่ค่าเท่ากับ เช่น เปรียบค่าเดือนหรือสถานะ | SWITCH(TRUE()): ใช้ได้กับเงื่อนไขช่วง (>=, <=, ) หรือเงื่อนไขซับซ้อนกว่า
SWITCH ประเมิน sequential (เรียงลำดับ) มันจะคืนผลลัพธ์ของ condition แรกที่เป็นจริง condition ที่หลังจะไม่ถูกประเมินอีก (short-circuit evaluation)
เรียงจากเฉพาะเจาะจงมาสามัญ หรือจากเข้มงวด (สูง) มาอ่อน (ต่ำ) เพื่อกันเงื่อนไขทับกัน เช่น >= 1000 ก่อน >= 500 ต่อมา
ถ้าไม่เข้าเงื่อนไขใดเลยและไม่ระบุ else SWITCH จะคืน BLANK() (ค่าว่าง)
ได้ใช้ทั้งใน Calculated Column และ Measure ลองได้ตามใจชอบ SWITCH เป็น logical function ลักษณะเดียวกับ IF ก็ว่าได้
SWITCH ต้องรับ scalar value (ค่าเดี่ยว) เท่านั้น ไม่สามารถใช้กับ table ได้ ถ้า expression คืนค่าเป็น table ต้องแปลงเป็น scalar ด้วยฟังก์ชันอย่าง COUNTROWS(), SUMX(), หรือ VALUES() ก่อน
SWITCH คือ logical control function ที่เปรียบเทียบ expression กับรายการ value และคืนผลลัพธ์ที่ตรงกัน ลองนึกดู ถ้า expression ตรงกับ value ไหนสักตัว มันจะคืน result ของเจ้า value นั้นทันที
มี 2 รูปแบบหลัก:
1. **Simple matching** – เทียบค่าเท่ากับ: SWITCH(Month, 1, “Jan”, 2, “Feb”, …)
2. **SWITCH(TRUE())** – เงื่อนไขแบบช่วง: SWITCH(TRUE(), Sales >= 1000, “High”, “Low”) ซึ่งช่วยลดการเขียน IF ซ้อนกัน
ส่วนตัวผมชอบ SWITCH(TRUE()) เพราะมันสวยกว่า IF มาก โค้ดอ่านง่าย และเขียนเร็ว 😎 ไม่ต้องเหน็ดเหนื่อยกับวงเล็บ IF ซ้อนหลายชั้น