ในโลกของการจัดการฐานข้อมูลขนาดใหญ่ (Enterprise Data Management) ข้อมูลที่ถูกจัดเก็บในรูปแบบข้อความ (String) ที่คั่นด้วยเครื่องหมายจุลภาค (Comma-Separated Values หรือ CSV) เป็นสิ่งที่พบเจอได้บ่อยครั้ง ปัญหาที่พบบ่อยคือการที่ข้อมูลเหล่านี้ถูกจัดเก็บในคอลัมน์เดียว ทำให้ไม่สามารถนำไปวิเคราะห์หรือประมวลผลในระดับแถว (Row) ได้อย่างมีประสิทธิภาพ
ในฐานะ System Specialist เราจึงต้องอาศัยเครื่องมือที่ทรงพลังอย่าง PostgreSQL เพื่อทำการ ‘แยก’ (Split) ค่าเหล่านั้นให้กลายเป็นข้อมูลที่สามารถเข้าถึงได้ทีละรายการ (Atomic Data) บทความนี้จะเจาะลึกถึงวิธีการใช้ฟังก์ชันเฉพาะของ PostgreSQL เพื่อจัดการกับข้อมูล CSV อย่างถูกต้องตามหลักการออกแบบสถาปัตยกรรมฐานข้อมูลชั้นสูง
หลักการทำงาน: การแยกสตริงใน PostgreSQL
PostgreSQL มีฟังก์ชันที่ออกแบบมาเพื่อจัดการกับงานนี้โดยเฉพาะ ซึ่งที่โดดเด่นที่สุดคือการใช้ฟังก์ชัน string_to_array() ร่วมกับ unnest() หรือการใช้ regexp_split_to_table() ซึ่งเป็นแนวทางที่ให้ประสิทธิภาพสูงกว่าในการแปลงสตริงให้เป็นชุดข้อมูลในรูปแบบตาราง (Set-Returning Function)
1. การใช้ string_to_array() และ unnest()
วิธีการนี้เหมาะสำหรับการแปลงสตริงที่ทราบตัวคั่น (Delimiter) ให้กลายเป็นอาร์เรย์ (Array) ก่อน จากนั้นจึงใช้ unnest() เพื่อขยายอาร์เรย์นั้นให้เป็นชุดข้อมูลแถวใหม่ (Rows) ซึ่งเป็นรูปแบบที่ฐานข้อมูลทำงานได้ดีที่สุด
SQL
SELECT unnest(string_to_array('apple,banana,orange', ',')) AS split_value;
คำอธิบาย: คำสั่งนี้จะรับสตริง ‘apple,banana,orange’ และใช้ ‘,’ เป็นตัวแบ่ง จากนั้น string_to_array() จะสร้างอาร์เรย์ {‘apple’, ‘banana’, ‘orange’} และ unnest() จะขยายอาร์เรย์นี้ให้กลายเป็นสามแถวข้อมูลที่แยกกันอย่างชัดเจน
2. การใช้ regexp_split_to_table() (แนะนำสำหรับความยืดหยุ่น)
สำหรับงานที่ซับซ้อนขึ้นหรือต้องการความยืดหยุ่นในการกำหนดตัวแบ่ง (Delimiter) การใช้ regexp_split_to_table() ถือเป็นแนวทางที่ทันสมัยและมีประสิทธิภาพสูงสุด เนื่องจากมันสามารถจัดการกับ Regular Expression ได้อย่างเต็มรูปแบบ
SQL
SELECT regexp_split_to_table('ID123;Name;Value', ';') AS split_data;
คำอธิบาย: ตัวอย่างนี้แสดงการใช้ตัวแบ่งเป็นเครื่องหมายเซมิโคลอน (;) ซึ่งเป็นการยืนยันว่าฟังก์ชันนี้สามารถรับตัวแบ่งได้หลากหลายกว่าแค่เครื่องหมายจุลภาค (,) ทำให้เหมาะกับการจัดการข้อมูลจากแหล่งที่มาที่แตกต่างกัน
บทสรุป: การเลือกใช้เครื่องมือที่เหมาะสม
การจัดการข้อมูล CSV ใน PostgreSQL ไม่ใช่แค่การตัดสตริง แต่คือการแปลงโครงสร้างข้อมูล (Data Transformation) จากรูปแบบ 1 มิติ (String) ไปสู่รูปแบบ 2 มิติ (Row/Column) การเลือกใช้ unnest(string_to_array(...)) หรือ regexp_split_to_table(...) ขึ้นอยู่กับความซับซ้อนของตัวแบ่งและประสิทธิภาพที่ต้องการ หากข้อมูลมีความสม่ำเสมอและตัวแบ่งง่ายๆ ให้ใช้ string_to_array() แต่ถ้าต้องการความยืดหยุ่นสูงสุดในการกำหนดรูปแบบตัวแบ่ง ควรใช้ regexp_split_to_table() เสมอ