---
title: CONTAINSROW – ตรวจสอบว่าแถวอยู่ในตาราง
url: https://www.thepexcel.com/functions/dax/information/containsrow-dax/
type: function-explainer
program: DAX
syntax: "CONTAINSROW(<table>, <value> [, <value> [, ... ] ])"
date: 2025-12-14
updated: 2025-12-25
scores:
  popularity: 5
  difficulty: 4
  usefulness: 5
---

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

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

## คำอธิบาย

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

## Syntax

```excel
CONTAINSROW(&lt;table&gt;, &lt;value&gt; [, &lt;value&gt; [, ... ] ])
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| table | Yes | Table |  | ตารางที่ต้องการเช็ค สามารถเป็นตาราง inline เช่น {"Red", "Blue"} หรือตาราง DAX เช่น SUMMARIZE() VALUES() ได้ |
| value | Yes | Scalar |  | ค่าที่ต้องการเช็คว่าตรงกันหรือไม่ จำนวนค่าต้องเท่ากับจำนวนคอลัมน์ในตาราง เรียงตามลำดับคอลัมน์ สามารถใส่หลายค่าได้ |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: เช็คสีในตารางอินไลน์

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

**ผลลัพธ์:** `TRUE`

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

### 2. ตัวอย่างที่ 2: เช็คคู่ ProductID-StoreID

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

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

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

### 3. ตัวอย่างที่ 3: ใช้กับ FILTER เพื่อกรองผลลัพธ์

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

**ผลลัพธ์:** `รายชื่อสินค้าที่มี Category ขึ้นทะเบียน`

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

### 4. ตัวอย่างที่ 4: ใช้ NOT เพื่อกรองตรงข้าม

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

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

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

## หมายเหตุเพิ่มเติม

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

- ระวัง order ของค่าที่ส่ง ต้องตรงกับลำดับคอลัมน์ในตาราง ถ้า SUMMARIZE(Sales, Sales[ProductID], Sales[StoreID]) ต้องส่ง (ProductID, StoreID) ไม่ได้ (StoreID, ProductID)

- ใช้ VAR เก็บตารางไว้ก่อนถ้าซ่อน expression ยาว มันจะทำให้ code อ่านง่ายกว่า เช่น VAR ValidPairs = SUMMARIZE(...) RETURN CONTAINSROW(ValidPairs, ...)

- ส่วนตัวผมชอบใช้ CONTAINSROW กับ FILTER มากกว่า CALCULATE เพราะ FILTER ประกาศ intent ชัดเจนกว่า (กรองแถวนี้ออก หรือเก็บแถวนี้) ส่วน CALCULATE มันเปลี่ยน context ซึ่งอาจซ่อนบ่วงน้อยลง

## คำถามที่พบบ่อย

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

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

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

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

**Q: BLANK กับ 0 ต่างกันไหม?**

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

**Q: ใช้ CONTAINSROW เมื่อไหร่ดี?**

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

## ฟังก์ชันที่เกี่ยวข้อง

- [CONTAINS – ตรวจสอบว่ามีแถวที่ตรงกับเงื่อนไขในตาราง](https://www.thepexcel.com/functions/dax/information/contains-dax/)
- [TREATAS – ส่งค่าข้ามตารางแบบเสมือน ไม่ต้องมี Relationship](https://www.thepexcel.com/functions/dax/table-manipulation/treatas-dax/)
- [INTERSECT – หาส่วนร่วมของสองตาราง](https://www.thepexcel.com/functions/dax/table-manipulation/intersect-dax/)
- [FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)](https://www.thepexcel.com/functions/dax/filter/filter-dax/)
- [COUNTROWS – นับจำนวนแถวในตารางและเทบิลเสมือน](https://www.thepexcel.com/functions/dax/aggregation/countrows-dax/)
- [CALCULATE – ฟังก์ชันหลักของ DAX ที่ควบคุม Filter Context](https://www.thepexcel.com/functions/dax/filter/calculate-dax/)
- [SUMMARIZE – จัดกลุ่มข้อมูลและสร้างตารางสรุป (Table Grouping)](https://www.thepexcel.com/functions/dax/table-manipulation/summarize-dax/)

## แหล่งข้อมูลเพิ่มเติม

- [DAX.guide - CONTAINSROW](http://dax.guide/containsrow/) _(guide)_
- [Microsoft Learn - CONTAINSROW Function](https://learn.microsoft.com/en-us/dax/containsrow-function-dax) _(official)_
- [SQLBI - DAX Pattern for Filtering with Multiple Columns](https://www.sqlbi.com/articles/row-context-and-filter-context-in-dax/) _(guide)_

---

_Source: [https://www.thepexcel.com/functions/dax/information/containsrow-dax/](https://www.thepexcel.com/functions/dax/information/containsrow-dax/)_
