คำตอบ: ใช้ได้
สามารถรวม LIKE กับ CONCAT() เพื่อสร้าง Pattern แบบ Dynamic ได้
ไวยากรณ์
WHERE column LIKE CONCAT('%', search_term, '%')
ตัวอย่างสมบูรณ์
1. สร้างตารางและข้อมูล
CREATE TABLE DemoTable (Name VARCHAR(50));
INSERT INTO DemoTable VALUES ('John');
INSERT INTO DemoTable VALUES ('Adam');
INSERT INTO DemoTable VALUES ('Bob');
INSERT INTO DemoTable VALUES ('Mike');
2. ค้นหาชื่อที่มีตัวอักษร 'o' อยู่ตรงไหนก็ได้
SELECT Name FROM DemoTable
WHERE Name LIKE CONCAT('%', 'o', '%');
3. ผลลัพธ์
+------+
| Name |
+------+
| John |
| Bob |
+------+
การประยุกต์ใช้จริง
1. รับค่าจาก Parameter/Variable
SET @search = 'ob';
SELECT Name FROM DemoTable
WHERE Name LIKE CONCAT('%', @search, '%');
-- ผลลัพธ์: Bob
2. ค้นหาจากหลายคอลัมน์ (OR)
SELECT * FROM Users
WHERE FirstName LIKE CONCAT('%', @keyword, '%')
OR LastName LIKE CONCAT('%', @keyword, '%')
OR Email LIKE CONCAT('%', @keyword, '%');
3. ใช้ใน Stored Procedure
CREATE PROCEDURE SearchUsers(IN keyword VARCHAR(100))
BEGIN
SELECT * FROM Users
WHERE FirstName LIKE CONCAT('%', keyword, '%')
OR LastName LIKE CONCAT('%', keyword, '%');
END;
4. Dynamic Pattern: เริ่มต้น/ลงท้าย/ตรงกลาง
-- เริ่มต้นด้วย keyword
WHERE Name LIKE CONCAT(keyword, '%')
-- ลงท้ายด้วย keyword
WHERE Name LIKE CONCAT('%', keyword)
-- มี keyword อยู่กลาง
WHERE Name LIKE CONCAT('%', keyword, '%')
ข้อควรระวังด้านประสิทธิภาพ
LIKE CONCAT('%', ..., '%')นำหน้าด้วย % → Full Table Scan ไม่ใช้ Index- สำหรับตารางใหญ่ ควรใช้ Full-Text Search หรือ Elasticsearch
LIKE CONCAT('prefix', '%')ขึ้นต้นคงที่ → ใช้ Index ได้
ฟังก์ชัน CONCAT() เพิ่มเติม
| ฟังก์ชัน | คำอธิบาย |
|---|---|
| CONCAT(str1, str2, ...) | รวมสตริง คืน NULL ถ้ามีค่า NULL ใดๆ |
| CONCAT_WS(sep, str1, str2, ...) | รวมด้วย Separator ข้าม NULL ไป |
สรุป
LIKE CONCAT('%', value, '%') ใช้ได้ และมีประโยชน์สำหรับ Dynamic Search Pattern แต่ควรระวังประสิทธิภาพกับตารางขนาดใหญ่