---
title: CONTAINS – ตรวจสอบว่ามีแถวที่ตรงกับเงื่อนไขในตาราง
url: https://www.thepexcel.com/functions/dax/information/contains-dax/
type: function-explainer
program: DAX
syntax: "CONTAINS(<table>, <columnName>, <value>[, <columnName>, <value>]...)"
date: 2025-12-14
updated: 2025-12-25
scores:
  popularity: 6
  difficulty: 4
  usefulness: 6
---

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

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

## คำอธิบาย

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

## Syntax

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

**Variant**

```excel
CONTAINS(&lt;table&gt;, &lt;columnName&gt;, &lt;value&gt;)
```

ตรวจสอบว่าคอลัมน์เดียวมีค่าที่ระบุหรือไม่

**Variant**

```excel
CONTAINS(&lt;table&gt;, &lt;columnName1&gt;, &lt;value1&gt;, &lt;columnName2&gt;, &lt;value2&gt;)
```

ตรวจสอบว่าแถวที่มีคอลัมน์หลายคอลัมน์พร้อมค่าเฉพาะมีอยู่หรือไม่

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| table | Yes | table |  | ตารางใดๆ ที่ส่งกลับโดยนิพจน์ DAX ซึ่งมีข้อมูลที่ต้องการค้นหา อาจเป็นตาราง source หรือ related table ก็ได้ |
| columnName | Yes | text |  | ชื่อคอลัมน์ที่มีอยู่จริงในตารางที่กำหนด ไม่สามารถเป็นนิพจน์ได้ ถ้าคอลัมน์อยู่ในตาราง related ต้องมีชื่อเต็มรูปแบบเช่น RelatedTable[ColumnName] |
| value | Yes | scalar |  | นิพจน์ DAX ที่ส่งกลับค่า scalar เดี่ยว ซึ่งจะใช้ค้นหาในคอลัมน์ที่ระบุ สามารถเป็นตัวเลข ข้อความ วันที่ หรือค่า logical ได้ |
| columnName, value (additional pairs) | No | scalar |  | สามารถเพิ่มคู่ columnName และ value ได้หลายคู่ เมื่อต้องตรวจสอบหลายคอลัมน์พร้อมกัน (เหมือน AND logic) ทุกเงื่อนไขต้องเป็นจริงเพื่อให้ CONTAINS คืน TRUE |

## เคสการใช้งาน

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

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

_เหมาะกับ:_ virtual-relationships

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

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

_เหมาะกับ:_ existence-checking

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

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

_เหมาะกับ:_ advanced-filtering

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: ตรวจสอบว่ามีการขายสินค้าเฉพาะหรือไม่

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

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

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

### 2. ตัวอย่างที่ 2: ตรวจสอบ combination (AND logic)

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

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

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

### 3. ตัวอย่างที่ 3: ใช้กับคอลัมน์จากตาราง related

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

**ผลลัพธ์:** `"Active" หรือ "Inactive"`

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

### 4. ตัวอย่างที่ 4: ตรวจสอบหลายค่าจากตาราง related

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

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

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

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

- ผมแนะนำให้เลือก CONTAINS หากต้องการตรวจสอบ combination ของค่าจากคอลัมน์ที่มีจริง เพราะมันเร็วและชัดเจน ถ้าต้องระบุชื่อคอลัมน์ ให้ใช้ Table[Column] ไม่ใช่เฉพาะชื่อคอลัมน์

- ระวัง columnName ต้องเป็นชื่อคอลัมน์ที่มีจริง ไม่สามารถใช้ expression ได้ ถ้าต้องการค้นหา expression ให้ใช้ COUNTROWS + FILTER แทน

- ส่วนตัวผมชอบใช้ CONTAINS เมื่อต้อง validate ข้อมูล เช่น "ข้อมูล sales นี้สำหรับ product และ region ที่ allow ขายหรือเปล่า" แล้วใช้ IF(CONTAINS(...), "Valid", "Invalid") จะได้อย่างมั่น

- ถ้าต้องตรวจสอบหลาย combination ใหญ่ๆ ลองใช้ TREATAS หรือ INTERSECT สำหรับกรณีที่ซับซ้อน เพราะมัน syntax ยาวแต่ maintainable กว่า CONTAINS หลายคู่

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

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

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

**Q: CONTAINS รองรับ DirectQuery หรือไม่?**

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

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

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

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

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

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

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

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

- [CONTAINSROW – ตรวจสอบว่าแถวอยู่ในตาราง](https://www.thepexcel.com/functions/dax/information/containsrow-dax/)
- [TREATAS – ส่งค่าข้ามตารางแบบเสมือน ไม่ต้องมี Relationship](https://www.thepexcel.com/functions/dax/table-manipulation/treatas-dax/)
- [FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)](https://www.thepexcel.com/functions/dax/filter/filter-dax/)
- [INTERSECT – หาส่วนร่วมของสองตาราง](https://www.thepexcel.com/functions/dax/table-manipulation/intersect-dax/)
- in-operator-dax
- [RELATEDTABLE – คืนตารางฝั่ง Many ที่สัมพันธ์กับแถวปัจจุบัน (One → Many)](https://www.thepexcel.com/functions/dax/relationship/relatedtable-dax/)
- [COUNTROWS – นับจำนวนแถวในตารางและเทบิลเสมือน](https://www.thepexcel.com/functions/dax/aggregation/countrows-dax/)

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

- [Microsoft Learn: CONTAINS Function](https://learn.microsoft.com/en-us/dax/contains-function-dax) _(official)_
- [DAX.guide: CONTAINS](https://dax.guide/contains/) _(guide)_
- [SQLBI: CONTAINS patterns](https://sqlbi.com/) _(guide)_

---

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