Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: ค้นหาค่าในชุดค่าคั่นคอมมาที่เก็บในตัวแปรด้วย FIND_IN_SET

การใช้ FIND_IN_SET() ค้นหาค่าในรายการคั่นคอมมาที่เก็บใน User Variable

FIND_IN_SET(str, strlist) คืนตำแหน่ง (1-based) ของ str ใน strlist (คั่นคอมมา) คืน 0 หากไม่พบ ใช้ได้กับคอลัมน์หรือตัวแปร

สร้างตารางและข้อมูล

mysql> create table DemoTable1411 (
    -> Value int
    -> );
Query OK, 0 rows affected (0.50 sec)

mysql> insert into DemoTable1411 values(10);
mysql> insert into DemoTable1411 values(50);
mysql> insert into DemoTable1411 values(60);

ตั้งค่า User Variable

mysql> set @setOfValues := '70,50,100';
Query OK, 0 rows affected (0.00 sec)

คำสั่ง FIND_IN_SET กับ Variable

mysql> select * from DemoTable1411
    -> where find_in_set(Value, @setOfValues);

ผลลัพธ์ (เฉพาะ 50 ที่อยู่ในชุด)

+-------+
| Value |
+-------+
| 50    |
+-------+

การทำงานของ FIND_IN_SET

  • FIND_IN_SET(50, '70,50,100') → คืน 2 (ตำแหน่งที่ 2) → TRUE
  • FIND_IN_SET(10, '70,50,100') → คืน 0 → FALSE
  • FIND_IN_SET(60, '70,50,100') → คืน 0 → FALSE

FIND_IN_SET vs IN()

กรณีใช้กับคอลัมน์ VARCHAR (CSV stored)

SELECT * FROM products 
WHERE FIND_IN_SET('red', tags);  -- tags = 'red,blue,green'

ข้อจำกัด

  • ไม่รองรับค่าที่มีคอมมาอยู่ในตัว (ต้อง escape/encode ก่อน)
  • Case-sensitive ตาม collation ของ arguments
  • ไม่ใช้ Index ได้ → Full scan

แนวทางปฏิบัติที่ดีกว่า: Normalize Schema

CREATE TABLE product_tags (
  product_id INT,
  tag VARCHAR(50),
  PRIMARY KEY (product_id, tag)
);

ใช้ JOIN แทน FIND_IN_SET — เร็ว, ถูกต้อง, รองรับ Index, Foreign Key

สรุป: FIND_IN_SET เหมาะสำหรับ ad-hoc query, legacy schema ที่เก็บ CSV ในคอลัมน์ — ไม่แนะนำสำหรับ schema ใหม่

ลักษณะFIND_IN_SETIN()
InputString (comma-separated)Value list / Subquery
Data typeString comparisonType-aware comparison
Performanceช้ากว่า (string parse)เร็วกว่า (optimizer รู้จัก)
Use caseค่ามาจาก VARCHAR column/variableHard-coded list / Subquery