Thep Excel

CONTAINSROWตรวจสอบว่าแถวอยู่ในตาราง

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

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

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

อัปเดต 14 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
table Table ตารางที่ต้องการเช็ค สามารถเป็นตาราง inline เช่น {“Red”, “Blue”} หรือตาราง DAX เช่น SUMMARIZE() VALUES() ได้
value Scalar ค่าที่ต้องการเช็คว่าตรงกันหรือไม่ จำนวนค่าต้องเท่ากับจำนวนคอลัมน์ในตาราง เรียงตามลำดับคอลัมน์ สามารถใส่หลายค่าได้

Additional Notes

CONTAINSROW คือฟังก์ชันสำหรับเช็คว่ามีแถวใดในตารางที่ค่าคอลัมน์ทั้งหมดตรงกับที่ระบุหรือไม่ มันสำคัญเวลาต้องการทำ lookup แบบหลายคอลัมน์พร้อมกัน

ที่เจ๋งคือ CONTAINSROW ทำให้การเช็คค่าหลายคอลัมน์พร้อมกันง่ายขึ้น เทียบเสมือนว่าคุณมีรายชื่อคู่ (ProductID, StoreID) และต้องการรู้ว่ามีคู่ (101, 5) อยู่ในรายชื่อนั้นหรือไม่ ถ้าตัวเลขตรงครบ เงื่อนไขที่มีก็ให้ TRUE ส่วนตัวผมใช้ CONTAINSROW เวลาต้องทำ master-detail validation หรือ check data integrity ระหว่างตาราง

Examples

ตัวอย่างที่ 1: เช็คสีในตารางอินไลน์Has Valid Color = CONTAINSROW( { "Red", "Blue", "Yellow" }, "Red" )

ตรวจสอบว่า "Red" อยู่ในรายชื่อสีหรือไม่ เนื่องจากมี "Red" อยู่ ผลลัพธ์คือ TRUE ใช้ตรวจสอบค่าเดี่ยวแบบง่ายๆ

fx
Has Valid Color = CONTAINSROW( { "Red", "Blue", "Yellow" }, "Red" )

ผลลัพธ์TRUE
ตัวอย่างที่ 2: เช็คคู่ ProductID-StoreIDHas Product-Store Pair = VAR Pairs = SUMMARIZE(Sales, Sales[ProductID], Sales[StoreID]) RETURN CONTAINSROW(Pairs, 101, 5)

สร้างตารางคู่ (ProductID, StoreID) จาก Sales ด้วย SUMMARIZE แล้วใช้ CONTAINSROW เพื่อเช็คว่ามีคู่ (101, 5) อยู่ในตารางหรือไม่ เหมาะสำหรับ validate master data

fx
Has Product-Store Pair =
VAR Pairs = SUMMARIZE(Sales, Sales[ProductID], Sales[StoreID])
RETURN CONTAINSROW(Pairs, 101, 5)

ผลลัพธ์TRUE หรือ FALSE
ตัวอย่างที่ 3: ใช้กับ FILTER เพื่อกรองผลลัพธ์Valid Products = FILTER( ALL(Product[Name]), CONTAINSROW( VALUES(Product[Category]), Product[Category] ) )

กรองสินค้าเฉพาะที่มี Category อยู่ในตาราง Category master ใช้ CONTAINSROW เป็นตัวกรองใน FILTER เพื่อคัดเลือกเฉพาะแถวที่ valid

fx
Valid Products =
FILTER(
ALL(Product[Name]),
CONTAINSROW(
VALUES(Product[Category]),
Product[Category]
)
)

ผลลัพธ์รายชื่อสินค้าที่มี Category ขึ้นทะเบียน
ตัวอย่างที่ 4: ใช้ NOT เพื่อกรองตรงข้ามInvalid Stores = FILTER( ALL(Store[StoreID]), NOT CONTAINSROW( VALUES(Sales[StoreID]), Store[StoreID] ) )

ค้นหาสาขาที่ไม่มีใครซื้อ (ไม่อยู่ในตาราง Sales) โดยใช้ NOT CONTAINSROW จะดูเหมือนหา missing records ใน master table

fx
Invalid Stores =
FILTER(
ALL(Store[StoreID]),
NOT CONTAINSROW(
VALUES(Sales[StoreID]),
Store[StoreID]
)
)

ผลลัพธ์รายชื่อสาขาที่ไม่มีการขายบันทึก

FAQs

CONTAINSROW และ IN operator ต่างกันอย่างไร?+

ตัวจริงแล้ว IN operator ทำงานเหมือน CONTAINSROW เลย ผมค่อนข้างมองว่า IN เป็น syntax ที่สะดวกกว่า เขียน Product[Color] IN {"Red", "Blue"} ง่ายกว่า CONTAINSROW({"Red", "Blue"}, Product[Color]) แต่ผลลัพธ์เหมือนเดิม

ต้องส่งค่ากี่ตัวใน value parameter?+

ต้องส่งให้เท่ากับจำนวนคอลัมน์ในตาราง เช่นตารางมี 2 คอลัมน์ต้องส่ง 2 ค่า ตาราง 3 คอลัมน์ต้องส่ง 3 ค่า เรียงตามลำดับคอลัมน์นะ ถ้าจำนวนไม่ตรง DAX จะขึ้น error

BLANK กับ 0 ต่างกันไหม?+

ผม highlight ตรงนี้เพราะสำคัญ CONTAINSROW ใช้ strict comparison หมายความว่า BLANK ไม่เท่ากับ 0 ตรงกันข้ามกับ = operator แบบปกติ ถ้าคอลัมน์มี BLANK และคุณส่ง 0 มา CONTAINSROW จะคืน FALSE เพราะมันถือว่าไม่ตรงกัน

ใช้ CONTAINSROW เมื่อไหร่ดี?+

ผมใช้ CONTAINSROW เวลาต้องตรวจสอบความสมบูรณ์ข้อมูล (data integrity) เช่น Product-Store mapping complete ไหม Customer สั่งซื้อครบทั้งประเทศไหม หรือต้อง lookup หลายคอลัมน์พร้อมกัน ถ้าเช็คแค่คอลัมน์เดียว CONTAINS หรือ IN ก็พอ

Resources & Related

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

ฟังก์ชันนี้CONTAINSROWInformation
Table manipulation (2)
SUMMARIZE

SUMMARIZE สร้างตารางสรุปโดยจัดกลุ่มข้อมูลตามคอลัมน์ที่กำหนด คล้าย GROUP BY ใน SQL หรือ Pivot Table ใน Excel คืนค่าตารางที่มีหนึ่งแถวต่อหนึ่ง unique combination ของคอลัมน์ที่เลือก สามารถอ้างถึงคอลัมน์จาก related table ได้โดยตรงโดยไม่ต้องใช้ RELATED มักใช้สร้าง virtual table ใน measure เพื่อทำ intermediate calculations ก่อนใช้ iterator functions อย่าง SUMX, AVERAGEX คำนวณต่อ ⚠️ Best Practice: ใช้ ADDCOLUMNS ครอบ SUMMARIZE แทนการใส่ extension columns ตรงๆ เพื่อ performance และ filter context control ที่ดีกว่า สำหรับ calculated table แนะนำใช้ SUMMARIZECOLUMNS แทนเนื่องจากมี performance ดีกว่าอย่างมาก

VALUES

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

Information (1)
CONTAINS

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

Filter (1)
FILTER

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

Comments

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