ใช้ FIND_IN_SET(str, csv_string) เพื่อตรวจสอบว่า String อยู่ใน Comma-Separated Values (CSV) String หรือไม่ เหมาะสำหรับส่งหลาย ID เข้า Parameter เดียวใน Application
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable1817 (
EmployeeName VARCHAR(20),
CountryName VARCHAR(20)
);
Query OK, 0 rows affected (0.00 sec)
2. เพิ่มข้อมูล
mysql> INSERT INTO DemoTable1817 VALUES('Chris', 'AUS');
mysql> INSERT INTO DemoTable1817 VALUES('David', 'UK');
mysql> INSERT INTO DemoTable1817 VALUES('Bob', 'US');
3. แสดงข้อมูล
mysql> SELECT * FROM DemoTable1817; +--------------+-------------+ | EmployeeName | CountryName | +--------------+-------------+ | Chris | AUS | | David | UK | | Bob | US | +--------------+-------------+
4. Query: หาพนักงานที่ CountryName อยู่ใน 'US,UK'
mysql> SELECT * FROM DemoTable1817 WHERE FIND_IN_SET(CountryName, 'US,UK');
5. ผลลัพธ์
+--------------+-------------+ | EmployeeName | CountryName | +--------------+-------------+ | David | UK | | Bob | US | +--------------+-------------+
การทำงานของ FIND_IN_SET
FIND_IN_SET('UK', 'US,UK')→ คืน2(ตำแหน่งที่ 2, 1-based) → TRUEFIND_IN_SET('AUS', 'US,UK')→ คืน0(ไม่เจอ) → FALSE- คืนค่า
0ถ้าไม่เจอหรือค่าเป็น NULL
การใช้งานใน Application (Parameter Binding)
// Java Example
String countries = "US,UK,AUS"; // มาจาก UI: Multi-select
String sql = "SELECT * FROM employees WHERE FIND_IN_SET(country, ?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, countries);
ResultSet rs = ps.executeQuery();
⚠️ ข้อจำกัดและข้อควรระวัง
| ข้อจำกัด | คำอธิบาย |
|---|---|
| ไม่ใช้ Index | Full Table Scan เสมอ (Function บน Column) |
| CSV String Length | จำกัดด้วย max_allowed_packet / group_concat_max_len |
| Space Sensitivity | 'US, UK' ≠ 'US,UK' (มี Space ระหว่าง) |
| Data Type | Argument ทั้งคู่ต้องเป็น String |