การใส่รายการสตริงแบบดั้งเดิมด้วย VALUES ('A'), ('B'), ... มักยาวและแก้ไขได้ยากเมื่อจำนวนข้อมูลเพิ่มขึ้น วิธีที่กระชับและดูแลรักษาง่ายกว่าคือการเก็บข้อมูลเป็น สตริงชุดเดียวที่คั่นด้วยเครื่องหมาย (Delimited String) แล้วใช้ฟังก์ชันเฉพาะของแต่ละฐานข้อมูลแปลงกลับมาเป็นแถวข้อมูล (Rows) เพื่อนำไปใช้งานต่อในคิวรี
PostgreSQL
SQL (PostgreSQL)
WITH RawData (tag_name) AS (
SELECT DISTINCT TRIM(unnest(string_to_array('Admin,Security,Database,Cloud,API', ',')))
)
SELECT tag_name FROM RawData;
Microsoft SQL Server (2016+)
T-SQL
WITH RawData (tag_name) AS (
SELECT DISTINCT TRIM(value)
FROM STRING_SPLIT('Admin,Security,Database,Cloud,API', ',')
)
SELECT tag_name FROM RawData;
Google BigQuery
GoogleSQL
WITH RawData AS (
SELECT DISTINCT TRIM(tag) AS tag_name
FROM UNNEST(SPLIT('Admin,Security,Database,Cloud,API', ',')) AS tag
)
SELECT tag_name FROM RawData;
Snowflake
Snowflake SQL
WITH RawData AS (
SELECT DISTINCT TRIM(f.value::STRING) AS tag_name
FROM TABLE(FLATTEN(input => SPLIT('Admin,Security,Database,Cloud,API', ','))) AS f
)
SELECT tag_name FROM RawData;
MySQL (8.0+) / MariaDB
MySQL ไม่มีฟังก์ชัน SPLIT แบบตรงตัว แต่ใน MySQL 8.0 ขึ้นไปสามารถแปลงสตริงเป็นรูปแบบ JSON Array แล้วคลี่ออกเป็นแถวด้วย JSON_TABLE ได้อย่างมีประสิทธิภาพ
MySQL 8.0+
WITH RawData AS (
SELECT DISTINCT TRIM(j.tag) AS tag_name
FROM JSON_TABLE(
'["Admin", "Security", "Database", "Cloud", "API"]',
'$[*]' COLUMNS (tag VARCHAR(50) PATH '$')
) AS j
)
SELECT tag_name FROM RawData;
💡 แนวทางปฏิบัติและข้อควรพิจารณา
- การใช้เครื่องมือช่วยทุ่นแรง: หากต้องการคงรูปแบบ
VALUESแบบเดิม สามารถใช้ Excel หรือสูตรสเปรดชีตจัดรูปแบบข้อความ หรือใช้ฟังก์ชัน Multi-cursor (Ctrl+Shift+LหรือCmd+Shift+L) ในโปรแกรมแก้ไขโค้ด เช่น VS Code เพื่อใส่เครื่องหมายครอบคำทั้งหมดพร้อมกันได้ - ประสิทธิภาพการทำงาน: ฟังก์ชัน
TRIM()และDISTINCTเหมาะสำหรับกรณีที่ข้อมูลต้นทางอาจมีช่องว่างหรือค่าซ้ำปนมา หากชุดข้อมูลได้รับการทำความสะอาดล่วงหน้าแล้ว สามารถตัดฟังก์ชันเหล่านี้ออกเพื่อลดต้นทุนการประมวลผลของระบบได้ - การเลือกโครงสร้างจัดเก็บ: เทคนิคนี้เหมาะสำหรับงาน Ad-hoc Query หรือการแปลงข้อมูลชั่วคราว หากชุดข้อมูลมีขนาดใหญ่หรือมีการเปลี่ยนแปลงบ่อย การจัดเก็บไว้ในตารางมาตรฐาน (Master Table) หรือนำเข้าผ่านคำสั่ง
COPY/LOAD DATA INFILEจะให้ประสิทธิภาพที่ดีกว่าในระยะยาว
บทสรุป
การแปลง Delimited String ออกเป็นแถวช่วยลดความซับซ้อนของ SQL Statement ได้อย่างมาก แม้ว่าแต่ละระบบฐานข้อมูลจะมีไวยากรณ์และฟังก์ชันเฉพาะตัวที่ต่างกัน เช่น STRING_SPLIT, string_to_array หรือ JSON_TABLE แต่ล้วนให้ผลลัพธ์แบบเดียวกัน การเลือกใช้งานให้ตรงกับ Engine ช่วยให้คิวรีทำงานได้อย่างถูกต้องและดูแลรักษาโค้ดได้ง่ายขึ้น
อ่านเพิ่มเติม