ป้ายกำกับ: Unnest

พันธุ์สนิทพันธุ์สนิท

ในฐานะ System Specialist และ Senior Architect การจัดการข้อมูลในโลกจริงมักพบกับสถานการณ์ที่ข้อมูลที่ควรจะแยกกันกลับถูกรวมเข้าด้วยกันเป็นสตริงเดียว (Comma-Separated Values: CSV) ซึ่งเปรียบเสมือนการมี ‘สายสัมพันธ์’ หรือ ‘การผูกพัน’ ของข้อมูลหลายส่วนเข้าด้วยกัน

ในบริบทของฐานข้อมูล PostgreSQL การจัดการข้อมูลลักษณะนี้ให้กลับมาเป็นโครงสร้างที่แยกส่วนได้ (Structured Data) อย่างถูกต้อง ถือเป็นทักษะสำคัญที่นักพัฒนาและสถาปนิกข้อมูลต้องเชี่ยวชาญ บทความนี้จะพาไปดูเครื่องมือทรงพลังของ PostgreSQL ในการ ‘คลายสายสัมพันธ์’ หรือที่เรียกว่า String Splitting เพื่อให้คุณสามารถนำข้อมูลที่ถูกรวมกันกลับมาใช้งานได้อย่างมีประสิทธิภาพ

→ หลักการทำงาน: การแยกสตริงใน PostgreSQL

PostgreSQL มีฟังก์ชันที่ออกแบบมาเพื่อจัดการกับปัญหาดังกล่าวโดยเฉพาะ คือ string_to_array() และ unnest() ซึ่งทำงานร่วมกันเพื่อเปลี่ยนสตริงที่คั่นด้วยตัวแบ่ง (Delimiter) ให้กลายเป็นชุดข้อมูล (Array) และจากนั้นก็แตกชุดข้อมูลนั้นออกมาเป็นแถว (Rows) ที่สามารถ Query ได้

→ ขั้นตอนที่ 1: การแปลงสตริงเป็น Array (string_to_array)

ฟังก์ชัน string_to_array(string, delimiter) จะรับสตริงและตัวคั่น (เช่น ‘,’) เข้ามา จากนั้นจะส่งออกเป็น PostgreSQL Array ชนิดข้อมูล

SQL

SELECT string_to_array('apple,banana,orange', ',')::text[];

ผลลัพธ์ที่ได้: {apple,banana,orange} (เป็น Array)

→ ขั้นตอนที่ 2: การแตก Array เป็นแถว (unnest)

เมื่อเราได้ Array แล้ว การจะนำไปใช้งานใน Query เพื่อให้แต่ละองค์ประกอบเป็นแถวเดี่ยวๆ เราต้องใช้ฟังก์ชัน unnest() ซึ่งจะทำหน้าที่คลาย Array ออกเป็นชุดของแถวข้อมูล (Row Set) ทำให้เราสามารถ Join หรือ Filter ข้อมูลแต่ละส่วนได้เหมือนเป็นคอลัมน์แยกกัน

SQL

SELECT unnest(string_to_array('id1,id2,id3', ',')) AS separated_id;

ผลลัพธ์ที่ได้:

SQL

separated_id |

SQL

-----------------|

SQL

id1             |

SQL

id2             |

SQL

id3             |

→ การประยุกต์ใช้ในงานจริง (Advanced Use Case)

การรวมฟังก์ชันเหล่านี้เข้าด้วยกันทำให้เราสามารถสร้าง CTE (Common Table Expression) หรือ Subquery เพื่อจัดการข้อมูลที่ซับซ้อนได้ ตัวอย่างเช่น หากคุณมีตาราง products ที่มีคอลัมน์ tags_list (เช่น ‘electronics,gadget,new’) คุณสามารถใช้ unnest() เพื่อดึงแท็กแต่ละอันออกมาเป็นแถวใหม่ เพื่อให้สามารถนับจำนวนแท็ก หรือ Join กับตารางแท็กอื่น ๆ ได้อย่างถูกต้อง

SQL

WITH raw_data AS (SELECT 'electronics,gadget,new' AS tags_list) SELECT unnest(string_to_array(tags_list, ',')) FROM raw_data;

→ บทสรุป (Conclusion)

การเข้าใจการทำงานของ string_to_array() และ unnest() ไม่ได้เป็นเพียงแค่การเขียนโค้ด แต่เป็นการยกระดับความเข้าใจในโครงสร้างข้อมูลระดับสถาปัตยกรรม (Architectural Understanding) มันช่วยให้เราสามารถเปลี่ยนข้อมูลที่ดูเหมือนจะ ‘ผูกพัน’ กันอย่างไม่เป็นระเบียบ ให้กลับมาเป็นข้อมูลที่มีความสัมพันธ์เชิงโครงสร้างที่ชัดเจนและพร้อมสำหรับการวิเคราะห์ใน PostgreSQL ได้อย่างสมบูรณ์แบบ การใช้เทคนิคเหล่านี้อย่างเชี่ยวชาญจะช่วยให้ระบบของคุณมีประสิทธิภาพและมีความยืดหยุ่นในการจัดการข้อมูลสูงขึ้นมาก