CONTAINS ค้นหาแถวในตารางและคืนค่า TRUE/FALSE เมื่อหาเจอค่าที่ตรงกับเงื่อนไขที่กำหนด เจ๋งเพราะมันเร็วกว่า COUNTROWS + FILTER มาก
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| table | table | ตารางใดๆ ที่ส่งกลับโดยนิพจน์ DAX ซึ่งมีข้อมูลที่ต้องการค้นหา อาจเป็นตาราง source หรือ related table ก็ได้ |
| columnName | text | ชื่อคอลัมน์ที่มีอยู่จริงในตารางที่กำหนด ไม่สามารถเป็นนิพจน์ได้ ถ้าคอลัมน์อยู่ในตาราง related ต้องมีชื่อเต็มรูปแบบเช่น RelatedTable[ColumnName] |
| value | scalar | นิพจน์ DAX ที่ส่งกลับค่า scalar เดี่ยว ซึ่งจะใช้ค้นหาในคอลัมน์ที่ระบุ สามารถเป็นตัวเลข ข้อความ วันที่ หรือค่า logical ได้ |
| [columnName, value (additional pairs)]ไม่บังคับ | scalar | สามารถเพิ่มคู่ columnName และ value ได้หลายคู่ เมื่อต้องตรวจสอบหลายคอลัมน์พร้อมกัน (เหมือน AND logic) ทุกเงื่อนไขต้องเป็นจริงเพื่อให้ CONTAINS คืน TRUE |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
CONTAINS คือตัวค้นหาแบบเร็วเหล่มสำหรับตรวจสอบว่าค่าเฉพาะนั้นมีอยู่ในตาราง DAX มันลักษณ์เหมือนเป็นการ JOIN สองตารางแบบเสมือน เพราะมันไม่ต้องสร้าง relationship จริงๆ แต่ยังเช็ค constraint ได้ตามต้องการ
ที่เจ๋งคือ CONTAINS เหมาะสำหรับตรวจสอบ combination ของค่า เช่น “มีการขายสินค้า 214 ให้ลูกค้า 11185 หรือเปล่า?” มันจะตอบแบบ TRUE/FALSE ตรงๆ ไม่ต้องนั่งนับแถวแบบ COUNTROWS ก่อน ซึ่งจะเร็วขึ้นเยอะ อย่างไรก็ตาม CONTAINS ใช้ได้แค่กับคอลัมน์ที่มีจริง ไม่ได้มีความเยื่อยนวลแบบ FILTER ที่รองรับนิพจน์ที่ซับซ้อนได้
ส่วนตัวผมชอบใช้ CONTAINS เพราะมันบอกความจำเจนตรง ถ้าต้องการตรวจสอบว่าข้อมูลมีอยู่จริงหรือไม่ แล้วที่ต้องการเป็นคอลัมน์ธรรมชาติ CONTAINS ถูกที่สุดครับ 😎
ใช้ CONTAINS เพื่อตรวจสอบว่าลูกค้าในตารางหนึ่งมีสัญญาในตารางอื่นหรือไม่ โดยไม่ต้องสร้างความสัมพันธ์ทั่วไป
ตรวจสอบว่าการรวมกันของผลิตภัณฑ์และลูกค้าที่เฉพาะเจาะจงมีการขายจริงหรือไม่ ในการสร้างมาตรการที่ขึ้นอยู่กับการมีอยู่ของข้อมูล
กรองแถวเพื่อแสดงเฉพาะชุดข้อมูลที่มีอยู่ในตารางแหล่งข้อมูล เช่น แสดงเฉพาะโครงการที่มีการลงนามจริงกับลูกค้า
ค้นหาในตาราง InternetSales เพื่อตรวจสอบว่ามีแถวใดที่มี ProductKey = 214 หรือไม่ ถ้าหาเจอ TRUE ถ้าไม่เจอ FALSE นี่คือการใช้งาน CONTAINS ที่ง่ายที่สุด
ตรวจสอบว่ามีการขายสินค้า 214 ให้ลูกค้า 11185 พร้อมกันหรือไม่ ทั้งสองเงื่อนไข ProductKey = 214 AND CustomerKey = 11185 ต้องเป็นจริงในแถวเดียวกัน
ใช้ CONTAINS ตรวจสอบว่า ProductKey ปัจจุบัน (จากตาราง Sales ที่กำลังคำนวณ) มีอยู่ในตาราง Products หรือไม่ ถ้ามีแสดง "Active" ถ้าไม่มี "Inactive" วิธีนี้เหมือนการ VLOOKUP แบบ "ชัวร์หรือเปล่า"
ตรวจสอบว่าชุดข้อมูล ProductID (ผ่าน RELATED) และ RegionID ปัจจุบันนั้นมีอยู่ในตาราง SalesRules หรือไม่ วิธีนี้ดีสำหรับการ validate ว่าข้อมูลเป็นไปตามกฎการขายหรือไม่
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 จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
INTERSECT คืนตารางของแถวที่อยู่ในทั้ง LeftTable และ RightTable เหมาะกับการหาสิ่งที่ซ้ำกัน/ร่วมกันระหว่างสองชุดข้อมูล โดยรักษาเอาแถวที่ซ้ำกันไว้ด้วย
TREATAS เป็นเสมือนการสร้าง "virtual relationship" โดยไม่ต้องแก้โมเดล ช่วยให้ส่งเงื่อนไขข้ามตารางที่ไม่เชื่อมกัน หรือเมื่อต้องการส่งหลายคีย์พร้อมกัน
VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้
CONTAINSROW ตรวจสอบว่ามีแถวที่ค่าคอลัมน์ตรงกันหมดหรือไม่ ถ้าเจอจะคืนค่า TRUE ไม่มีจะคืน FALSE
FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่