CONTAINS ค้นหาแถวในตารางและคืนค่า TRUE/FALSE เมื่อหาเจอค่าที่ตรงกับเงื่อนไขที่กำหนด เจ๋งเพราะมันเร็วกว่า COUNTROWS + FILTER มาก
=CONTAINS(<table>, <columnName>, <value>[, <columnName>, <value>]...)
=CONTAINS(<table>, <columnName>, <value>[, <columnName>, <value>]...)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| table | table | Yes | ตารางใดๆ ที่ส่งกลับโดยนิพจน์ DAX ซึ่งมีข้อมูลที่ต้องการค้นหา อาจเป็นตาราง source หรือ related table ก็ได้ | |
| columnName | text | Yes | ชื่อคอลัมน์ที่มีอยู่จริงในตารางที่กำหนด ไม่สามารถเป็นนิพจน์ได้ ถ้าคอลัมน์อยู่ในตาราง related ต้องมีชื่อเต็มรูปแบบเช่น RelatedTable[ColumnName] | |
| value | scalar | Yes | นิพจน์ DAX ที่ส่งกลับค่า scalar เดี่ยว ซึ่งจะใช้ค้นหาในคอลัมน์ที่ระบุ สามารถเป็นตัวเลข ข้อความ วันที่ หรือค่า logical ได้ | |
| columnName, value (additional pairs) | scalar | Optional | สามารถเพิ่มคู่ columnName และ value ได้หลายคู่ เมื่อต้องตรวจสอบหลายคอลัมน์พร้อมกัน (เหมือน AND logic) ทุกเงื่อนไขต้องเป็นจริงเพื่อให้ CONTAINS คืน TRUE |
ใช้ CONTAINS เพื่อตรวจสอบว่าลูกค้าในตารางหนึ่งมีสัญญาในตารางอื่นหรือไม่ โดยไม่ต้องสร้างความสัมพันธ์ทั่วไป
ตรวจสอบว่าการรวมกันของผลิตภัณฑ์และลูกค้าที่เฉพาะเจาะจงมีการขายจริงหรือไม่ ในการสร้างมาตรการที่ขึ้นอยู่กับการมีอยู่ของข้อมูล
กรองแถวเพื่อแสดงเฉพาะชุดข้อมูลที่มีอยู่ในตารางแหล่งข้อมูล เช่น แสดงเฉพาะโครงการที่มีการลงนามจริงกับลูกค้า
Product Exists = CONTAINS( InternetSales, [ProductKey], 214 )Product Exists = CONTAINS(
InternetSales,
[ProductKey],
214
)
TRUE หรือ FALSE
Customer Product Pair = CONTAINS( InternetSales, [ProductKey], 214, [CustomerKey], 11185 )Customer Product Pair = CONTAINS(
InternetSales,
[ProductKey],
214,
[CustomerKey],
11185
)
TRUE หรือ FALSE
Is Active Product = IF( CONTAINS( Products, Products[ProductKey], [ProductKey] ), "Active", "Inactive" )Is Active Product = IF(
CONTAINS(
Products,
Products[ProductKey],
[ProductKey]
),
"Active",
"Inactive"
)
"Active" หรือ "Inactive"
Valid Sale = CONTAINS( SalesRules, SalesRules[ProductID], RELATED(Products[ProductID]), SalesRules[RegionID], [RegionID] )Valid Sale = CONTAINS(
SalesRules,
SalesRules[ProductID],
RELATED(Products[ProductID]),
SalesRules[RegionID],
[RegionID]
)
TRUE หรือ FALSE
CONTAINS ต้องระบุชื่อคอลัมน์อย่างชัดเจนทีละตัว ส่วน CONTAINSROW ใช้กับตาราง inline (ที่สร้างเอง) และค่าต้องตรงกันตามลำดับของคอลัมน์ CONTAINS โครงสร้างชัดเจนกว่า แต่ CONTAINSROW ดีกว่าเมื่อต้องจัดการกับข้อมูลที่คืนจาก expression
CONTAINS รองรับ DirectQuery ใน Measures และ Calculated Columns ปกติ แต่ห้ามใช้กับคอลัมน์ที่คำนวณ (Computed Columns) หรือ RLS (Row-Level Security) เพราะ DirectQuery ไม่สามารถประเมิน custom expression ได้
ได้ครับ แต่คอลัมน์ต้องมีชื่อเต็มรูปแบบ เช่น Products[CategoryID] และตารางต้องมี relationship ที่ชัดเจนกับตาราง source ไม่ใช่ว่า relationship ไม่อยู่ก็ใช้ได้ มันต้องมี relationship ที่ดีทีปรึกษา
CONTAINS จะค้นหา BLANK เหมือนค่าอื่นๆ ถ้าคอลัมน์มี BLANK และค่าค้นหาเป็น BLANK ก็จะหาเจอและคืน TRUE การจัดการ BLANK นี้ดีสำหรับการตรวจสอบว่าข้อมูล incomplete หรือไม่
ใช่ CONTAINS เร็วกว่ามากเพราะ DAX engine เพิ่มประสิทธิภาพให้มัน แต่ถ้าต้องการค้นหา expression ที่ซับซ้อน (เช่น SUM > 1000) ต้องใช้ COUNTROWS + FILTER แทน CONTAINS ทำเฉพาะคอลัมน์ธรรมชาติได้เท่านั้น
CONTAINS คือตัวค้นหาแบบเร็วเหล่มสำหรับตรวจสอบว่าค่าเฉพาะนั้นมีอยู่ในตาราง DAX มันลักษณ์เหมือนเป็นการ JOIN สองตารางแบบเสมือน เพราะมันไม่ต้องสร้าง relationship จริงๆ แต่ยังเช็ค constraint ได้ตามต้องการ
ที่เจ๋งคือ CONTAINS เหมาะสำหรับตรวจสอบ combination ของค่า เช่น “มีการขายสินค้า 214 ให้ลูกค้า 11185 หรือเปล่า?” มันจะตอบแบบ TRUE/FALSE ตรงๆ ไม่ต้องนั่งนับแถวแบบ COUNTROWS ก่อน ซึ่งจะเร็วขึ้นเยอะ อย่างไรก็ตาม CONTAINS ใช้ได้แค่กับคอลัมน์ที่มีจริง ไม่ได้มีความเยื่อยนวลแบบ FILTER ที่รองรับนิพจน์ที่ซับซ้อนได้
ส่วนตัวผมชอบใช้ CONTAINS เพราะมันบอกความจำเจนตรง ถ้าต้องการตรวจสอบว่าข้อมูลมีอยู่จริงหรือไม่ แล้วที่ต้องการเป็นคอลัมน์ธรรมชาติ CONTAINS ถูกที่สุดครับ 😎