Text.Contains ใช้สำหรับตรวจสอบว่าข้อความที่กำหนด (text) มีข้อความย่อยที่ต้องการค้นหา (substring) อยู่ภายในหรือไม่ ส่งคืนค่า true หรือ false
=Text.Contains(text, substring, comparer)
=Text.Contains(text, substring, comparer)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| text | text | Yes | ข้อความที่ต้องการค้นหา (สามารถเป็น null ได้) | |
| substring | text | Yes | ส่วนข้อความย่อยที่ต้องการค้นหาภายในข้อความแรก | |
| comparer | function | Optional | Comparer.Ordinal (case-sensitive) | ฟังก์ชันเปรียบเทียบ เช่น Comparer.OrdinalIgnoreCase สำหรับการค้นหาแบบไม่สนใจตัวพิมพ์เล็กใหญ่ |
กรองรายการสินค้าที่มีคำว่า "Discount" หรือ "Promotion" อยู่ในชื่อ
เช็คว่าชื่อไฟล์มีนามสกุล ".xlsx" หรือ ".csv" หรือไม่
ถ้าพบคำว่า "Apple" ในข้อความ ให้จัดอยู่ในหมวด "Fruit"
Text.Contains("Hello World", "Hello")= Text.Contains("Hello World", "Hello")
true
Text.Contains("Hello World", "hello")= Text.Contains("Hello World", "hello")
false
Text.Contains("Hello World", "hello", Comparer.OrdinalIgnoreCase)= Text.Contains("Hello World", "hello", Comparer.OrdinalIgnoreCase)
true
let Products = #table( type table [ProductCode = text, ProductName = text, Price = number], { {"PROD-001", "Laptop", 25000}, {"PROD-002", "Mouse", 500}, {"PART-…= let
Products = #table(
type table [ProductCode = text, ProductName = text, Price = number],
{
{"PROD-001", "Laptop", 25000},
{"PROD-002", "Mouse", 500},
{"PART-003", "Keyboard", 1200},
{"PROD-004", "Monitor", 8000},
{"PART-005", "USB Cable", 150}
}
),
FilteredProducts = Table.SelectRows(
Products,
each Text.Contains([ProductCode], "PROD")
)
in
FilteredProducts
ตารางที่มี 3 แถว: PROD-001 (Laptop), PROD-002 (Mouse), PROD-004 (Monitor)
let Accounts = #table( type table [Account = text, Balance = number], { {"us-2004", 580}, {"ca-8843", 280}, {"pa-1274", 90}, {"pty-507", 110} } ), FindAccounts…= let
Accounts = #table(
type table [Account = text, Balance = number],
{
{"us-2004", 580},
{"ca-8843", 280},
{"pa-1274", 90},
{"pty-507", 110}
}
),
FindAccounts = Table.SelectRows(
Accounts,
each Text.Contains([Account], "A-", Comparer.OrdinalIgnoreCase) or
Text.Contains([Account], "7", Comparer.OrdinalIgnoreCase)
)
in
FindAccounts
ตารางที่มี 3 แถว: ca-8843, pa-1274, pty-507
เหมือนกันบ้าง แต่ต่างกันตรงที่ FIND ของ Excel คืนค่าเป็นเลข (ตำแหน่งที่พบ) ขณะที่ Text.Contains คืนค่า true/false ถ้าต้องการตำแหน่ง ใน Power Query ให้ใช้ Text.PositionOf แทน
ไม่รองรับ Text.Contains ทำการค้นหาแบบตรงตัว (Literal) เท่านั้น ถ้าต้องการ Wildcard ลองใช้ Text.Match กับ Regular Expression แทน
Text.Contains จะคืนค่า null ถ้าพารามิเตอร์แรก (text) เป็น null ต่างจากการส่ง substring ที่เป็น null ซึ่งจะเกิด Error
Ordinal ใช้การเปรียบเทียบแบบตัวอักษรบริสุทธิ์ ส่วน FromCulture ใช้กฎการเปรียบเทียบของวัฒนธรรม/ภาษาที่กำหนด เช่นการจัดการตัวอักษรพิเศษในภาษาต่างๆ
เพราะ Table.SelectRows ต้องการให้ส่งค่า logical (true/false) เพื่อตัดสินใจว่าแถวไหนจะเก็บไว้ Text.Contains คืนค่า true/false พอดี ทำให้เป็นความเชื่อมโยงที่สมบูรณ์
Text.Contains เป็นฟังก์ชันที่ใช้หาข้อความภายในข้อความอื่น โดยค่าเริ่มต้นจะพิจารณาความแตกต่างของตัวพิมพ์เล็กใหญ่ (case-sensitive) ซึ่งหมายความว่า “Hello” กับ “hello” ถือว่าต่างกัน
ที่เจ๋งคือ Text.Contains มีพารามิเตอร์ตัวเลือก (comparer) ที่ให้คุณเลือกว่าจะทำการเปรียบเทียบแบบไหน เช่น ไม่สนใจความแตกต่างของตัวพิมพ์เล็กใหญ่ได้ เหมาะสำหรับการกรองข้อมูลในตาราง เช่น ค้นหาสินค้า ค้นหาลูกค้า หรือตรวจสอบว่ารหัสข้อมูลมีอักขระที่ต้องการหรือไม่
ส่วนตัวผมมักใช้ Text.Contains ร่วมกับ Table.SelectRows เพื่อกรองแถวของตารางตามเงื่อนไขการค้นหาข้อความ วิธีนี้ทำให้การจัดการข้อมูลทั้งหมดง่ายขึ้นมาก 😎