Database: List String

การใส่รายการสตริงแบบดั้งเดิมด้วย 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;

💡 แนวทางปฏิบัติและข้อควรพิจารณา

  1. การใช้เครื่องมือช่วยทุ่นแรง: หากต้องการคงรูปแบบ VALUES แบบเดิม สามารถใช้ Excel หรือสูตรสเปรดชีตจัดรูปแบบข้อความ หรือใช้ฟังก์ชัน Multi-cursor (Ctrl+Shift+L หรือ Cmd+Shift+L) ในโปรแกรมแก้ไขโค้ด เช่น VS Code เพื่อใส่เครื่องหมายครอบคำทั้งหมดพร้อมกันได้
  2. ประสิทธิภาพการทำงาน: ฟังก์ชัน TRIM() และ DISTINCT เหมาะสำหรับกรณีที่ข้อมูลต้นทางอาจมีช่องว่างหรือค่าซ้ำปนมา หากชุดข้อมูลได้รับการทำความสะอาดล่วงหน้าแล้ว สามารถตัดฟังก์ชันเหล่านี้ออกเพื่อลดต้นทุนการประมวลผลของระบบได้
  3. การเลือกโครงสร้างจัดเก็บ: เทคนิคนี้เหมาะสำหรับงาน Ad-hoc Query หรือการแปลงข้อมูลชั่วคราว หากชุดข้อมูลมีขนาดใหญ่หรือมีการเปลี่ยนแปลงบ่อย การจัดเก็บไว้ในตารางมาตรฐาน (Master Table) หรือนำเข้าผ่านคำสั่ง COPY / LOAD DATA INFILE จะให้ประสิทธิภาพที่ดีกว่าในระยะยาว

บทสรุป

การแปลง Delimited String ออกเป็นแถวช่วยลดความซับซ้อนของ SQL Statement ได้อย่างมาก แม้ว่าแต่ละระบบฐานข้อมูลจะมีไวยากรณ์และฟังก์ชันเฉพาะตัวที่ต่างกัน เช่น STRING_SPLIT, string_to_array หรือ JSON_TABLE แต่ล้วนให้ผลลัพธ์แบบเดียวกัน การเลือกใช้งานให้ตรงกับ Engine ช่วยให้คิวรีทำงานได้อย่างถูกต้องและดูแลรักษาโค้ดได้ง่ายขึ้น


อ่านเพิ่มเติม

Exit mobile version