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

MySQL: เพิ่มเครื่องหมายอัญประกาศ (Quotes) ในคอลัมน์คั่นคอมมาด้วย REPLACE และ CONCAT

การเพิ่ม 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'   |
+------------------------+

อธิบายขั้นตอน

  1. REPLACE(Name, ',', "','") — แทนที่คอมมา , ด้วย ',' (quote + comma + quote)
  2. 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