วัน: 12 พฤศจิกายน 2020

PHP: การตรวจสอบคำในสตริงด้วย str_contains()PHP: การตรวจสอบคำในสตริงด้วย str_contains()

ในโลกของการพัฒนาแอปพลิเคชันที่ใช้ฐานข้อมูล การจัดการกับข้อมูลประเภทสตริง (String Manipulation) ถือเป็นทักษะพื้นฐานที่สำคัญอย่างยิ่ง งานที่พบบ่อยที่สุดอย่างหนึ่งคือการตรวจสอบว่าข้อมูลในคอลัมน์นั้นๆ มีคำหรือรูปแบบย่อย (Substring) ที่เราต้องการอยู่ภายในหรือไม่

แม้ว่าในภาษาโปรแกรมอย่าง PHP จะมีฟังก์ชันที่ชัดเจนอย่าง str_contains() แต่เมื่อเราทำงานอยู่ในระดับฐานข้อมูลอย่าง PostgreSQL การตรวจสอบนี้จะต้องใช้ไวยากรณ์ SQL ที่มีประสิทธิภาพและเชื่อถือได้ บทความนี้จะเจาะลึกถึงวิธีการตรวจสอบคำย่อยใน PostgreSQL เพื่อให้โค้ดของคุณมีความแม่นยำและเป็นไปตามหลักการของ Database Architect ชั้นเยี่ยม

💡 ทำไมต้องใช้ PostgreSQL ในการตรวจสอบสตริง?

การตรวจสอบสตริงใน PostgreSQL ไม่ได้จำกัดอยู่แค่การค้นหาแบบตรงตัวเท่านั้น แต่ยังสามารถใช้ Regular Expressions (Regex) หรือฟังก์ชันเฉพาะทางเพื่อเพิ่มความยืดหยุ่นในการค้นหาได้ การเลือกใช้ฟังก์ชันที่เหมาะสมจะช่วยให้ Query ของคุณมีประสิทธิภาพสูงและป้องกันข้อผิดพลาดทางตรรกะที่อาจเกิดขึ้นจากการใช้คำสั่งที่ผิด

✅ วิธีที่ 1: การใช้คำสั่ง LIKE (Standard SQL)

วิธีที่ง่ายและเป็นมาตรฐานที่สุดคือการใช้คำสั่ง LIKE ร่วมกับ Wildcard % ซึ่งหมายถึงการแทนที่ด้วยอักขระใดๆ ก็ได้ (Zero or more characters) นี่คือวิธีที่เหมาะสำหรับการค้นหาแบบกว้างๆ ที่ไม่ต้องการความซับซ้อนของรูปแบบ

SQL

SELECT user_name FROM users WHERE user_name LIKE '%keyword%';

คำอธิบาย: การใช้ %keyword% หมายความว่า ระบบจะค้นหาแถวใดๆ ที่มีคำว่า keyword อยู่ที่ตำแหน่งใดก็ได้ในสตริง

✅ วิธีที่ 2: การใช้ฟังก์ชัน STRPOS หรือ POSITION (Precision Check)

หากคุณต้องการตรวจสอบว่าคำย่อยนั้นมีอยู่ในสตริงหรือไม่ และต้องการทราบตำแหน่งที่แน่นอนของการปรากฏตัวของคำนั้น (เพื่อนำไปใช้ในการคำนวณหรือ Logic อื่นๆ) คุณควรใช้ฟังก์ชัน STRPOS() หรือ POSITION() ซึ่งจะคืนค่าเป็นตำแหน่งตัวอักษร (Integer) หากไม่พบคำย่อย จะคืนค่าเป็น NULL

SQL

SELECT * FROM products WHERE STRPOS(product_description, 'apple') > 0;

ข้อดี: การตรวจสอบว่า STRPOS(column, 'keyword') > 0 เป็นวิธีที่ให้ผลลัพธ์ที่ชัดเจนและแม่นยำกว่าการใช้ LIKE หากคุณต้องการเพียงแค่การยืนยันการมีอยู่ของคำย่อย

✅ วิธีที่ 3: การใช้ Regular Expressions (Regex)

สำหรับกรณีที่การค้นหาของคุณมีความซับซ้อน เช่น ต้องการค้นหาคำที่ขึ้นต้นด้วยตัวเลขและตามด้วยตัวอักษรเท่านั้น (Pattern Matching) คุณควรใช้ตัวดำเนินการ ~ ซึ่งเป็นการเปรียบเทียบแบบ Regular Expression

SQL

SELECT * FROM articles WHERE title ~ '^[A-Z][a-z]+';

สรุปการเลือกใช้:

  • ใช้ LIKE: เมื่อต้องการความง่ายและเร็วในการค้นหาแบบทั่วไป
  • ใช้ STRPOS(): เมื่อต้องการความแม่นยำและทราบตำแหน่งของคำย่อย
  • ใช้ ~: เมื่อรูปแบบการค้นหาของคุณมีความซับซ้อนและต้องการการจับคู่ตามรูปแบบ (Pattern Matching)

🚀 บทสรุป: แนวทางปฏิบัติที่ดีที่สุด (Best Practices)

การตรวจสอบคำย่อยใน PostgreSQL ไม่ได้มีคำตอบเดียวที่ดีที่สุด แต่ขึ้นอยู่กับความต้องการด้านความแม่นยำและประสิทธิภาพของ Query ของคุณ หากคุณเพียงต้องการคำตอบ Yes/No ว่ามีคำนั้นอยู่หรือไม่ การใช้ STRPOS() จะให้ความชัดเจนทางตรรกะที่สุด ในขณะที่หากคุณต้องการความยืดหยุ่นในการค้นหาที่ซับซ้อน การใช้ Regex ด้วย ~ คือคำตอบสุดท้ายของ Senior Architect