ป้ายกำกับ: Sql

แบ่งชื่อ นามสกุล คำนำหน้านามแบ่งชื่อ นามสกุล คำนำหน้านาม

ในโลกของการจัดการฐานข้อมูล (Database Management) การจัดเก็บข้อมูลบุคคลมักพบปัญหาที่ข้อมูลชื่อ-นามสกุลถูกรวมอยู่ในฟิลด์เดียว (Single String Field) ซึ่งส่งผลให้เกิดความยุ่งยากในการเรียกใช้ (Querying) หรือการวิเคราะห์ข้อมูล (Analytics) เนื่องจากเราไม่สามารถแยกส่วนประกอบต่างๆ เช่น คำนำหน้านาม (Title), ชื่อ (First Name), ชื่อกลาง (Middle Name), และนามสกุล (Last Name) ออกจากกันได้อย่างแม่นยำ

บทความนี้จะนำเสนอแนวทางการแก้ไขปัญหานี้โดยใช้พลังของ PostgreSQL ซึ่งเป็นระบบจัดการฐานข้อมูลที่ทรงประสิทธิภาพ โดยเน้นการใช้ฟังก์ชันทางภาษา SQL ในการแยก (Parsing) และจัดโครงสร้างข้อมูลสตริงให้เป็นส่วนประกอบที่เหมาะสมสำหรับการจัดเก็บแบบ Normalized Data

💡 หลักการแยกชื่อ-นามสกุลใน PostgreSQL

การแยกชื่อที่ซับซ้อน (เช่น มีคำนำหน้าทางทหาร หรือคำนำหน้าวิชาชีพ) จำเป็นต้องใช้ฟังก์ชันที่สามารถจัดการกับรูปแบบของสตริง (String Pattern) ได้อย่างยืดหยุ่น ใน PostgreSQL เราสามารถใช้ฟังก์ชันที่เกี่ยวข้องกับการจัดการอาร์เรย์ (Array) และ Regular Expressions (RegEx) เพื่อให้ได้ผลลัพธ์ที่แม่นยำกว่าการใช้ฟังก์ชัน `SPLIT_PART` แบบพื้นฐาน

🛠️ การใช้งานฟังก์ชันสำหรับแยกส่วนประกอบชื่อ

สมมติว่าเรามีข้อมูลชื่อเต็มที่อยู่ในคอลัมน์ชื่อว่า full_name และเราต้องการแยกออกเป็น 4 ส่วนหลัก คือ Title, First Name, Middle Name, และ Last Name เราสามารถใช้เทคนิคการรวมฟังก์ชัน regexp_split_to_array ร่วมกับการกำหนดเงื่อนไขเพื่อระบุตำแหน่งของแต่ละส่วนได้

ในตัวอย่างนี้ เราจะจำลองการแยกชื่อที่ประกอบด้วย Title (เช่น นาย), First Name, Middle Name, และ Last Name:

SQL

-- สมมติว่าเรามีตาราง 'people' ที่มีคอลัมน์ 'full_name' อยู่แล้ว<br>WITH data_input AS ( <br>    SELECT 'นาย พิชญ์ แอน พันธุ์สนิท' AS full_name <br>    UNION ALL <br>    SELECT 'นางสาว อรุณรัตน์ วัฒนโภค' AS full_name <br>    UNION ALL <br>    SELECT 'กานต์' AS full_name -- กรณีไม่มี Title และชื่อกลาง<br>) <br>SELECT <br>    (regexp_split_to_array(full_name, ' '))[1] AS title, <br>    (regexp_split_to_array(full_name, ' '))[2] AS first_name, <br>    (regexp_split_to_array(full_name, ' '))[3] AS middle_name, <br>    (regexp_split_to_array(full_name, ' '))[4] AS last_name <br>FROM data_input;

คำอธิบายโค้ด:

  • regexp_split_to_array(full_name, ' '): ฟังก์ชันนี้จะทำการแยกสตริงทั้งหมดตามช่องว่าง (Space) และส่งผลลัพธ์ออกมาเป็นรูปแบบของอาร์เรย์ (Array)
  • [N]: การใช้ดัชนี (Index) เพื่อดึงค่าที่ต้องการจากอาร์เรย์ (ใน PostgreSQL การนับเริ่มต้นที่ 1)

ข้อควรระวัง: หากชื่อมีจำนวนคำไม่ครบ (เช่น มีแค่ชื่อและนามสกุล) การใช้ดัชนีที่ตายตัวอาจทำให้เกิดค่า NULL ซึ่งเป็นเรื่องปกติที่ต้องจัดการในระดับแอปพลิเคชันที่เรียกใช้ SQL นี้

✅ การปรับปรุงโครงสร้างข้อมูล (Schema Design)

เมื่อเราสามารถแยกส่วนประกอบชื่อได้อย่างแม่นยำแล้ว สิ่งสำคัญถัดไปคือการออกแบบ Schema ของตารางให้รองรับการแยกส่วนเหล่านี้อย่างชัดเจน แทนที่จะมีคอลัมน์ full_name เพียงคอลัมน์เดียว ควรมีการเพิ่มคอลัมน์ย่อยดังนี้:

  1. title (VARCHAR)
  2. first_name (VARCHAR)
  3. middle_name (VARCHAR, NULLABLE)
  4. last_name (VARCHAR)

การออกแบบเช่นนี้ไม่เพียงแต่ช่วยให้การ Query ข้อมูลเฉพาะส่วนทำได้ง่ายขึ้นเท่านั้น แต่ยังช่วยให้การรักษาความสมบูรณ์ของข้อมูล (Data Integrity) และการทำ Indexing ในส่วนย่อยๆ มีประสิทธิภาพสูงสุดอีกด้วย

✨ บทสรุป

การจัดการข้อมูลชื่อที่ซับซ้อนในฐานข้อมูลจำเป็นต้องอาศัยเครื่องมือที่ทรงพลังอย่าง PostgreSQL การใช้ฟังก์ชันจัดการสตริงและอาร์เรย์อย่างเหมาะสม ไม่เพียงแต่ช่วยให้เราสามารถแยกส่วนประกอบของชื่อได้อย่างแม่นยำเท่านั้น แต่ยังเป็นรากฐานสำคัญในการสร้างระบบฐานข้อมูลที่มีความยืดหยุ่นและสามารถรองรับการขยายตัวของข้อมูลในอนาคตได้อย่างมีประสิทธิภาพ