ในโลกของการจัดการฐานข้อมูลจริง ข้อมูลมักจะไม่ได้ถูกเก็บในรูปแบบที่สมบูรณ์เสมอไป โดยเฉพาะอย่างยิ่งเมื่อเราต้องรับข้อมูลที่มาจากแหล่งภายนอก เช่น ไฟล์ CSV หรือ API ที่ส่งข้อมูลมาเป็นสตริงที่คั่นด้วยเครื่องหมายจุลภาค (Comma-Separated Values: CSV) ปัญหาคือการที่ข้อมูลเหล่านี้ถูกเก็บในคอลัมน์เดียว ทำให้การนำไปใช้งานหรือการ Query ข้อมูลทำได้ยาก
ในฐานะ System Architect เราจำเป็นต้องมีเครื่องมือที่ทรงพลังในการแยกสตริงเหล่านั้นให้กลายเป็นแถวข้อมูล (Rows) ที่สามารถ Query ได้อย่างมีประสิทธิภาพ บทความนี้จะพาคุณไปเจาะลึกถึงเทคนิคการใช้ฟังก์ชันของ PostgreSQL เพื่อแก้ปัญหานี้อย่างเป็นระบบ
หลักการแยกสตริง CSV ใน PostgreSQL
PostgreSQL มีชุดฟังก์ชันที่ออกแบบมาเพื่อจัดการกับข้อมูลประเภทนี้โดยเฉพาะ โดยหลักการสำคัญคือการใช้ฟังก์ชัน string_to_array() ร่วมกับ unnest() ฟังก์ชันเหล่านี้ช่วยให้เราสามารถแปลงสตริงยาวๆ ที่คั่นด้วยตัวคั่น (Delimiter) ให้กลายเป็นอาร์เรย์ (Array) และจากนั้นก็ ‘คลี่’ (Unnest) อาร์เรย์นั้นให้กลายเป็นชุดของแถวข้อมูลใหม่ในรูปแบบที่ SQL เข้าใจ
ขั้นตอนการใช้งาน (The Mechanism)
- string_to_array(string, delimiter): ฟังก์ชันนี้จะรับสตริงและตัวคั่น (เช่น ‘,’) เข้ามา จากนั้นจะคืนค่าเป็น PostgreSQL Array
- unnest(array): ฟังก์ชันนี้จะรับ Array เข้ามา แล้วทำการ ‘คลี่’ องค์ประกอบแต่ละตัวใน Array ให้กลายเป็นแถวข้อมูล (Row) ใหม่
การรวมกันของสองฟังก์ชันนี้ทำให้เราสามารถเปลี่ยนข้อมูลที่ไม่เป็นระเบียบ (Unstructured String) ให้กลายเป็นข้อมูลที่มีโครงสร้าง (Structured Data) ได้อย่างง่ายดายและมีประสิทธิภาพสูง
ตัวอย่างโค้ด: การแปลง CSV เป็นแถวข้อมูล
สมมติว่าเรามีสตริงที่เก็บชื่อผลไม้ที่คั่นด้วยจุลภาคในคอลัมน์ชื่อ csv_data และเราต้องการแยกมันออกมาเป็นแถวข้อมูลแต่ละแถว:
SQL
SELECT unnest(string_to_array('apple,banana,orange', ',')) AS fruit_name;
ผลลัพธ์ที่ได้:
SQL
fruit_name
SQL
apple
SQL
banana
SQL
orange
หากต้องการนำไปใช้กับตารางจริง จะสามารถเขียนได้ดังนี้:
SQL
SELECT t.id, unnest(string_to_array(t.csv_data, ',')) AS separated_value FROM your_table t;
บทสรุปสำหรับสถาปนิกระบบ
การใช้ string_to_array() และ unnest() เป็นเทคนิคที่สำคัญอย่างยิ่งสำหรับนักพัฒนาและ System Architect ที่ต้องทำงานกับข้อมูลที่มาจากแหล่งภายนอก การทำความเข้าใจกลไกนี้ไม่เพียงแต่ช่วยให้เราจัดการกับข้อมูลได้อย่างแม่นยำเท่านั้น แต่ยังช่วยให้เราออกแบบ Schema ที่ยืดหยุ่นมากขึ้นด้วย การใช้ฟังก์ชันเหล่านี้อย่างถูกวิธีจะช่วยลดความซับซ้อนในการประมวลผลข้อมูล (Data ETL) และทำให้ประสิทธิภาพของ Query โดยรวมสูงขึ้นอย่างเห็นได้ชัด