PlusMagi's Blog By Pitt Phunsanit Database ลองมาใช้แบบสบาย ๆ กันหน่อยไหม (ぷらぷらチッケッタ)

ลองมาใช้แบบสบาย ๆ กันหน่อยไหม (ぷらぷらチッケッタ)

ในโลกของการพัฒนาซอฟต์แวร์และฐานข้อมูลจริง ๆ ข้อมูลมักจะมาในรูปแบบที่หลากหลายรูปแบบหนึ่งที่พบบ่อยและสร้างความท้าทายคือการที่ข้อมูลที่ควรจะเป็นหลายรายการ (Multiple Values) ถูกเก็บรวมกันอยู่ในฟิลด์เดียวในรูปแบบของสตริง (Comma-Separated Values: CSV) การจัดการกับข้อมูลลักษณะนี้ด้วย SQL แบบดั้งเดิมอาจยุ่งยากและต้องใช้โค้ดที่ซับซ้อน

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

💡 หลักการทำงาน: การแยกสตริงด้วย PostgreSQL

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

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

ฟังก์ชัน string_to_array(string, delimiter) จะรับสตริงและตัวคั่น (Delimiter) เข้ามา จากนั้นจะแปลงสตริงนั้นให้กลายเป็นโครงสร้างข้อมูลแบบ Array (อาร์เรย์) ซึ่งเป็นขั้นตอนแรกในการเตรียมข้อมูล

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

เมื่อข้อมูลอยู่ในรูปแบบ Array แล้ว เราจะใช้ฟังก์ชัน unnest(array) เพื่อ ‘คลี่’ (Unnest) ค่าทั้งหมดใน Array นั้นให้กลายเป็นชุดของแถวข้อมูล (Rows) ที่แยกจากกันอย่างสมบูรณ์ ทำให้เราสามารถนำค่าแต่ละค่าไปใช้งานในคำสั่ง SQL อื่น ๆ ได้อย่างเป็นธรรมชาติ

💻 ตัวอย่างโค้ด: การแยกข้อมูล CSV ใน PostgreSQL

สมมติว่าเรามีตาราง products ที่มีคอลัมน์ product_id และ tags (ซึ่งเป็นสตริงแบบ ‘tag1,tag2,tag3’) เราต้องการดึงแท็กแต่ละตัวให้เป็นแถวแยกกัน:

SQL

-- 1. สร้างข้อมูลตัวอย่าง (Sample Data) ภายใต้ตารางจำลอง (CTE) <code>raw_data</code>
WITH raw_data AS (
    SELECT 1 AS product_id, 'apple,banana,orange' AS tags
),
-- 2. ใช้ string_to_array เพื่อแปลงสตริงเป็น Array
unnested_tags AS (
    SELECT 
        product_id,
        string_to_array(tags, ',') AS tag_array
    FROM raw_data
)
-- 3. ใช้ unnest() เพื่อคลี่ Array ให้เป็นแถวข้อมูลที่ใช้งานได้
SELECT 
    t.product_id,
    unnest(t.tag_array) AS extracted_tag
FROM unnested_tags t;

ผลลัพธ์ที่ได้:
จะแสดง 3 แถว โดยมี product_id เดียวกัน แต่มี extracted_tag แยกเป็น ‘apple’, ‘banana’, และ ‘orange’ ตามลำดับ ซึ่งเป็นข้อมูลที่พร้อมสำหรับการวิเคราะห์หรือ Join กับตารางอื่น ๆ ได้ทันที

✅ สรุปและข้อดีในการใช้งาน

การใช้คู่ฟังก์ชัน string_to_array() และ unnest() ใน PostgreSQL ถือเป็น Best Practice สำหรับการจัดการข้อมูลที่ถูกจัดเก็บในรูปแบบสตริงแบบคั่น (Delimited Strings) มันช่วยลดความซับซ้อนของคำสั่ง SQL อย่างมาก ทำให้โค้ดมีความกระชับ (Concise) มีประสิทธิภาพสูง และง่ายต่อการบำรุงรักษา (Maintainable) หากคุณต้องทำงานกับข้อมูลที่มาจากแหล่งภายนอกที่ไม่ได้มีการแยกคอลัมน์อย่างถูกต้อง เทคนิคนี้คือเครื่องมือสำคัญที่คุณไม่ควรมองข้ามในการเป็น System Specialist ระดับสูง