การเพิ่ม Single Quotes รอบค่าที่คั่นด้วยคอมมาในคอลัมน์ TEXT
ใช้ REPLACE() แทนที่คอมมา ด้วย ', ' แล้ว CONCAT() เพิ่ม quote นำหน้าและท้ายสตริง
สร้างตารางและข้อมูล
mysql> create table DemoTable1407 (
-> Name text
-> );
Query OK, 0 rows affected (0.51 sec)
mysql> insert into DemoTable1407 values('John,Bob');
mysql> insert into DemoTable1407 values('Carol,David,Adam');
mysql> insert into DemoTable1407 values('Mike,Sam,Chris');
ข้อมูลต้นฉบับ
+------------------+ | Name | +------------------+ | John,Bob | | Carol,David,Adam | | Mike,Sam,Chris | +------------------+
คำสั่งเพิ่ม Quotes
mysql> select concat("'", replace(Name, ",", "','"), "'") as IncludingQuotes
-> from DemoTable1407;
ผลลัพธ์
+------------------------+ | IncludingQuotes | +------------------------+ | 'John','Bob' | | 'Carol','David','Adam' | | 'Mike','Sam','Chris' | +------------------------+
อธิบายขั้นตอน
REPLACE(Name, ',', "','")— แทนที่คอมมา,ด้วย','(quote + comma + quote)CONCAT("'", ..., "'")— เพิ่ม single quote นำหน้าและท้ายสตริงทั้งหมด
กรณีข้อมูลมี Quote อยู่แล้ว / Escape
-- หากข้อมูลมี single quote อยู่แล้ว เช่น "O'Neil,Smith"
-- ต้อง escape ก่อน
REPLACE(REPLACE(Name, "'", "\\'"), ",", "','")
ใช้งานกับ IN clause (Dynamic SQL)
ผลลัพธ์สามารถนำไปใช้ใน IN (...) ได้:
SET @names = (SELECT CONCAT("'", REPLACE(Name, ",", "','"), "'") FROM DemoTable1407 WHERE ...);
SET @sql = CONCAT("SELECT * FROM Users WHERE Name IN (", @names, ")");
PREPARE stmt FROM @sql;
EXECUTE stmt;
ข้อควรระวัง: SQL Injection risk — ต้อง validate/sanitize input ก่อนใช้ dynamic SQL
MySQL 8.0+: JSON_ARRAYAGG (ทางเลือกสมัยใหม่)
SELECT JSON_ARRAYAGG(TRIM(name)) FROM (
SELECT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(t.Name, ',', n), ',', -1)) AS name
FROM DemoTable1407 t
JOIN (SELECT 1 n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) nums
ON n <= 1 + LENGTH(t.Name) - LENGTH(REPLACE(t.Name, ',', ''))
) split;
ได้ JSON array จริง: ["John", "Bob"] ใช้งานง่ายกว่าใน application