ในโลกของการจัดการข้อมูล (Data Engineering) ข้อมูลจำนวนมากมักไม่ได้ถูกจัดเก็บในรูปแบบที่สมบูรณ์เสมอไป บางครั้งเราอาจได้รับข้อมูลที่มาในรูปแบบของข้อความยาวๆ ที่มีการคั่นด้วยเครื่องหมาย (Delimiter) เช่น รายชื่อสินค้าที่คั่นด้วยเครื่องหมายจุลภาค (comma-separated values: CSV) การแยกข้อมูลเหล่านี้ให้กลับมาอยู่ในรูปแบบของแถว (Row) และคอลัมน์ (Column) ที่ถูกต้องจึงเป็นทักษะสำคัญที่นักพัฒนาฐานข้อมูลต้องมี
บทความนี้จะพาคุณไปทำความเข้าใจการใช้งานฟังก์ชันที่ทรงพลังอย่าง string_to_array และ unnest ใน PostgreSQL ซึ่งเป็นวิธีมาตรฐานในการจัดการและแยกข้อมูลที่ถูกรวมอยู่ในสตริงเดียวให้กลายเป็นชุดข้อมูลที่สามารถนำไปใช้งานต่อได้
หลักการทำงานของ String Splitting ใน PostgreSQL
โดยปกติแล้ว PostgreSQL จะจัดการข้อมูลแบบโครงสร้าง (Structured Data) แต่เมื่อเจอกับข้อมูลแบบข้อความ (Unstructured String) เราจำเป็นต้องใช้ฟังก์ชันที่ช่วยในการแยกส่วน (Split) ฟังก์ชันหลักที่ใช้คือ string_to_array(string, delimiter) ซึ่งจะรับสตริงและตัวคั่น (Delimiter) เข้ามา แล้วส่งผลลัพธ์ออกมาเป็นอาร์เรย์ (Array) จากนั้นเราจะใช้ฟังก์ชัน unnest() เพื่อขยายอาร์เรย์นั้นให้กลายเป็นชุดของแถวข้อมูล (Rows) ที่เป็นมาตรฐานของ SQL
ตัวอย่างการใช้งาน String_Split
สมมติว่าเรามีข้อมูลรายการรหัสสินค้าที่ถูกรวมไว้ในสตริงเดียวคือ ‘ABC-101,XYZ-202,DEF-303’ เราต้องการแยกแต่ละรหัสให้เป็นแถวข้อมูลที่แยกกันอย่างชัดเจน
SQL
SELECT unnest(string_to_array('ABC-101,XYZ-202,DEF-303', ',')) AS product_code;
คำอธิบายโค้ด:
string_to_array('ABC-101,XYZ-202,DEF-303', ','): ทำหน้าที่แปลงสตริงให้เป็นอาร์เรย์ โดยใช้เครื่องหมายจุลภาค (',') เป็นตัวแบ่งunnest(...): ทำหน้าที่คลี่ (Unnest) อาร์เรย์ที่ได้ออกมาเป็นชุดของแถวข้อมูล (Set of Rows) ทำให้แต่ละค่าในอาร์เรย์กลายเป็นค่าในคอลัมน์
การประยุกต์ใช้ในสถานการณ์จริง (Advanced Use Case)
การใช้ string_to_array และ unnest มีประโยชน์อย่างยิ่งในการทำ ETL (Extract, Transform, Load) เมื่อคุณต้องโหลดข้อมูลจากไฟล์ CSV ที่มีโครงสร้างไม่แน่นอน หรือเมื่อคุณต้องการแยกข้อมูลที่ถูกเก็บไว้ในฟิลด์เดียว (เช่น รายชื่อผู้ติดต่อที่คั่นด้วยเครื่องหมาย ‘|’) ออกมาเป็นรายการย่อยๆ เพื่อนำไปประมวลผลต่อในตารางใหม่
SQL
-- ตัวอย่างการแยกรายการอีเมลที่คั่นด้วยเครื่องหมาย |<br>WITH raw_data (email_string) AS (SELECT '[email protected] | [email protected] | [email protected]' )<br>SELECT unnest(string_to_array(email_string, ' ')) AS email_address<br>FROM raw_data;
การทำเช่นนี้ช่วยให้เราสามารถเปลี่ยนข้อมูลที่ดูเหมือนเป็นข้อความธรรมดาให้กลายเป็นชุดข้อมูลเชิงโครงสร้างที่ PostgreSQL สามารถนำไป Query, Join, หรือ Aggregate ต่อไปได้อย่างมีประสิทธิภาพ
บทสรุป
การเข้าใจการทำงานของฟังก์ชัน string_to_array และ unnest ถือเป็นกุญแจสำคัญสำหรับผู้ที่ทำงานด้านการจัดการข้อมูลใน PostgreSQL การใช้เทคนิคนี้อย่างถูกต้องจะช่วยให้คุณสามารถจัดการกับข้อมูลที่ไม่มีโครงสร้าง (Semi-structured data) ได้อย่างง่ายดาย ทำให้กระบวนการ ETL ของคุณมีความยืดหยุ่นและแข็งแกร่งยิ่งขึ้นในการรองรับข้อมูลจากแหล่งที่มาที่หลากหลาย