Thep Excel

CONTAINSตรวจสอบว่ามีแถวที่ตรงกับเงื่อนไขในตาราง

CONTAINS ค้นหาแถวในตารางและคืนค่า TRUE/FALSE เมื่อหาเจอค่าที่ตรงกับเงื่อนไขที่กำหนด เจ๋งเพราะมันเร็วกว่า COUNTROWS + FILTER มาก

fx
=CONTAINS(<table>, <columnName>, <value>[, <columnName>, <value>]…)

ความนิยม6/10
ความยาก4/10
ประโยชน์6/10

อัปเดต 14 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
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

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

CONTAINS คือตัวค้นหาแบบเร็วเหล่มสำหรับตรวจสอบว่าค่าเฉพาะนั้นมีอยู่ในตาราง DAX มันลักษณ์เหมือนเป็นการ JOIN สองตารางแบบเสมือน เพราะมันไม่ต้องสร้าง relationship จริงๆ แต่ยังเช็ค constraint ได้ตามต้องการ

ที่เจ๋งคือ CONTAINS เหมาะสำหรับตรวจสอบ combination ของค่า เช่น “มีการขายสินค้า 214 ให้ลูกค้า 11185 หรือเปล่า?” มันจะตอบแบบ TRUE/FALSE ตรงๆ ไม่ต้องนั่งนับแถวแบบ COUNTROWS ก่อน ซึ่งจะเร็วขึ้นเยอะ อย่างไรก็ตาม CONTAINS ใช้ได้แค่กับคอลัมน์ที่มีจริง ไม่ได้มีความเยื่อยนวลแบบ FILTER ที่รองรับนิพจน์ที่ซับซ้อนได้

ส่วนตัวผมชอบใช้ CONTAINS เพราะมันบอกความจำเจนตรง ถ้าต้องการตรวจสอบว่าข้อมูลมีอยู่จริงหรือไม่ แล้วที่ต้องการเป็นคอลัมน์ธรรมชาติ CONTAINS ถูกที่สุดครับ 😎

How it works

สร้างความสัมพันธ์เสมือน (Virtual Relationships)

ใช้ CONTAINS เพื่อตรวจสอบว่าลูกค้าในตารางหนึ่งมีสัญญาในตารางอื่นหรือไม่ โดยไม่ต้องสร้างความสัมพันธ์ทั่วไป

ตรวจสอบการมีอยู่ของแถว

ตรวจสอบว่าการรวมกันของผลิตภัณฑ์และลูกค้าที่เฉพาะเจาะจงมีการขายจริงหรือไม่ ในการสร้างมาตรการที่ขึ้นอยู่กับการมีอยู่ของข้อมูล

ตัวกรองข้อมูลขั้นสูง

กรองแถวเพื่อแสดงเฉพาะชุดข้อมูลที่มีอยู่ในตารางแหล่งข้อมูล เช่น แสดงเฉพาะโครงการที่มีการลงนามจริงกับลูกค้า

Examples

ตัวอย่างที่ 1: ตรวจสอบว่ามีการขายสินค้าเฉพาะหรือไม่Product Exists = CONTAINS( InternetSales, [ProductKey], 214 )

ค้นหาในตาราง InternetSales เพื่อตรวจสอบว่ามีแถวใดที่มี ProductKey = 214 หรือไม่ ถ้าหาเจอ TRUE ถ้าไม่เจอ FALSE นี่คือการใช้งาน CONTAINS ที่ง่ายที่สุด

fx
Product Exists = CONTAINS(
InternetSales,
[ProductKey],
214
)

ผลลัพธ์TRUE หรือ FALSE
ตัวอย่างที่ 2: ตรวจสอบ combination (AND logic)Customer Product Pair = CONTAINS( InternetSales, [ProductKey], 214, [CustomerKey], 11185 )

ตรวจสอบว่ามีการขายสินค้า 214 ให้ลูกค้า 11185 พร้อมกันหรือไม่ ทั้งสองเงื่อนไข ProductKey = 214 AND CustomerKey = 11185 ต้องเป็นจริงในแถวเดียวกัน

fx
Customer Product Pair = CONTAINS(
InternetSales,
[ProductKey],
214,
[CustomerKey],
11185
)

ผลลัพธ์TRUE หรือ FALSE
ตัวอย่างที่ 3: ใช้กับคอลัมน์จากตาราง relatedIs Active Product = IF( CONTAINS( Products, Products[ProductKey], [ProductKey] ), "Active", "Inactive" )

ใช้ CONTAINS ตรวจสอบว่า ProductKey ปัจจุบัน (จากตาราง Sales ที่กำลังคำนวณ) มีอยู่ในตาราง Products หรือไม่ ถ้ามีแสดง "Active" ถ้าไม่มี "Inactive" วิธีนี้เหมือนการ VLOOKUP แบบ "ชัวร์หรือเปล่า"

fx
Is Active Product = IF(
CONTAINS(
Products,
Products[ProductKey],
[ProductKey]
),
"Active",
"Inactive"
)

ผลลัพธ์"Active" หรือ "Inactive"
ตัวอย่างที่ 4: ตรวจสอบหลายค่าจากตาราง relatedValid Sale = CONTAINS( SalesRules, SalesRules[ProductID], RELATED(Products[ProductID]), SalesRules[RegionID], [RegionID] )

ตรวจสอบว่าชุดข้อมูล ProductID (ผ่าน RELATED) และ RegionID ปัจจุบันนั้นมีอยู่ในตาราง SalesRules หรือไม่ วิธีนี้ดีสำหรับการ validate ว่าข้อมูลเป็นไปตามกฎการขายหรือไม่

fx
Valid Sale = CONTAINS(
SalesRules,
SalesRules[ProductID],
RELATED(Products[ProductID]),
SalesRules[RegionID],
[RegionID]
)

ผลลัพธ์TRUE หรือ FALSE

FAQs

ความแตกต่างระหว่าง CONTAINS กับ CONTAINSROW คืออะไร?+

CONTAINS ต้องระบุชื่อคอลัมน์อย่างชัดเจนทีละตัว ส่วน CONTAINSROW ใช้กับตาราง inline (ที่สร้างเอง) และค่าต้องตรงกันตามลำดับของคอลัมน์ CONTAINS โครงสร้างชัดเจนกว่า แต่ CONTAINSROW ดีกว่าเมื่อต้องจัดการกับข้อมูลที่คืนจาก expression

CONTAINS รองรับ DirectQuery หรือไม่?+

CONTAINS รองรับ DirectQuery ใน Measures และ Calculated Columns ปกติ แต่ห้ามใช้กับคอลัมน์ที่คำนวณ (Computed Columns) หรือ RLS (Row-Level Security) เพราะ DirectQuery ไม่สามารถประเมิน custom expression ได้

สามารถใช้ CONTAINS กับตาราง related ได้หรือไม่?+

ได้ครับ แต่คอลัมน์ต้องมีชื่อเต็มรูปแบบ เช่น Products[CategoryID] และตารางต้องมี relationship ที่ชัดเจนกับตาราง source ไม่ใช่ว่า relationship ไม่อยู่ก็ใช้ได้ มันต้องมี relationship ที่ดีทีปรึกษา

ถ้าค่าเป็น BLANK จะเกิดอะไรขึ้น?+

CONTAINS จะค้นหา BLANK เหมือนค่าอื่นๆ ถ้าคอลัมน์มี BLANK และค่าค้นหาเป็น BLANK ก็จะหาเจอและคืน TRUE การจัดการ BLANK นี้ดีสำหรับการตรวจสอบว่าข้อมูล incomplete หรือไม่

CONTAINS มีประสิทธิภาพดีกว่า COUNTROWS + FILTER หรือไม่?+

ใช่ CONTAINS เร็วกว่ามากเพราะ DAX engine เพิ่มประสิทธิภาพให้มัน แต่ถ้าต้องการค้นหา expression ที่ซับซ้อน (เช่น SUM > 1000) ต้องใช้ COUNTROWS + FILTER แทน CONTAINS ทำเฉพาะคอลัมน์ธรรมชาติได้เท่านั้น

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ CONTAINS จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้CONTAINSInformation
Table manipulation (3)
INTERSECT

INTERSECT คืนตารางของแถวที่อยู่ในทั้ง LeftTable และ RightTable เหมาะกับการหาสิ่งที่ซ้ำกัน/ร่วมกันระหว่างสองชุดข้อมูล โดยรักษาเอาแถวที่ซ้ำกันไว้ด้วย

TREATAS

TREATAS เป็นเสมือนการสร้าง "virtual relationship" โดยไม่ต้องแก้โมเดล ช่วยให้ส่งเงื่อนไขข้ามตารางที่ไม่เชื่อมกัน หรือเมื่อต้องการส่งหลายคีย์พร้อมกัน

VALUES

VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้

Information (1)
CONTAINSROW

CONTAINSROW ตรวจสอบว่ามีแถวที่ค่าคอลัมน์ตรงกันหมดหรือไม่ ถ้าเจอจะคืนค่า TRUE ไม่มีจะคืน FALSE

Filter (1)
FILTER

FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่