PlusMagi's Blog By Pitt Phunsanit Database C# Control Flow: การใช้เงื่อนไข if-else, switch-expressions ยุคใหม่ และการลูปข้อมูลทุกรูปแบบ

C# Control Flow: การใช้เงื่อนไข if-else, switch-expressions ยุคใหม่ และการลูปข้อมูลทุกรูปแบบ

ในฐานะ Senior Architect การออกแบบระบบที่แข็งแกร่งไม่ได้ขึ้นอยู่กับแค่โครงสร้างของ Schema หรือความเร็วในการ Query เท่านั้น แต่หัวใจสำคัญที่สุดคือการจัดการ ตรรกะ (Logic) ของข้อมูลอย่างแม่นยำ PostgreSQL ในฐานะเครื่องมือระดับ Enterprise Database จึงมีกลไกทรงพลังหลายอย่างที่ช่วยให้เราสามารถจำลองกระบวนการคิดและการตัดสินใจของมนุษย์ลงในโค้ด SQL ได้

Control Flow ในโลกของฐานข้อมูล: การควบคุมทิศทางของตรรกะ

Control Flow ในบริบทของ PostgreSQL คือชุดคำสั่งที่กำหนดว่าเมื่อใดควรจะประมวลผลโค้ดส่วนไหน, ควรมีการตัดสินใจอย่างไร, และการทำงานนั้นต้องทำซ้ำกี่รอบ เราไม่ได้ใช้ `if-else` หรือ `for` แบบภาษาโปรแกรมโดยตรง แต่เราใช้โครงสร้างทาง SQL ที่เทียบเท่ากัน ซึ่งมีประสิทธิภาพสูงและเป็นมาตรฐานของฐานข้อมูล

1. การตัดสินใจแบบทางแยก (Conditional Branching) ด้วย CASE WHEN

CASE WHEN คือเครื่องมือที่ทรงพลังที่สุดในการจำลองการทำงานของ if-else if-else ในภาษาโปรแกรม มันช่วยให้เราสามารถตรวจสอบเงื่อนไขหลายอย่างและคืนค่าผลลัพธ์ตามเงื่อนไขแรกที่เป็นจริง (First Match Wins) ทำให้โค้ดของเราอ่านง่ายกว่าการใช้ Subquery หรือ Join ที่ซับซ้อน

SQL

-- ตัวอย่าง: การจัดกลุ่มสถานะคำสั่งซื้อ (Order Status Logic) ใช้วิธี CASE WHEN แทน if-else</code>
SELECT
    order_id,
    status,
    CASE
        WHEN status = 'PENDING' AND created_at < NOW() - INTERVAL '1 day' THEN 'OVERDUE'
        WHEN status = 'PROCESSING' THEN 'IN_PROGRESS'
        WHEN status IN ('SHIPPED', 'DELIVERED') THEN 'COMPLETED'
        ELSE 'UNKNOWN'
    END AS calculated_status
FROM orders;

2. การทำซ้ำและการสร้างชุดข้อมูล (Iteration) ด้วย generate_series()

ในโลกของฐานข้อมูล เรามักไม่ใช้ลูปแบบ for โดยตรง แต่เราจะใช้ฟังก์ชันที่จำลองการวนซ้ำ เช่น generate_series() ซึ่งเป็นวิธีมาตรฐานในการสร้างชุดตัวเลขหรือช่วงเวลา (Sequence) เพื่อนำไปใช้ในการคำนวณ หรือเพื่อทำ Mock Data Testing

SQL

-- ตัวอย่าง: การจำลองการวนซ้ำ 5 ครั้ง (Looping from 1 to 5)
SELECT generate_series(1, 5) AS iteration_number;

3. ลำดับขั้นตอนที่ซับซ้อนด้วย Recursive CTE

สำหรับตรรกะที่ต้องมีการอ้างอิงถึงผลลัพธ์ก่อนหน้า (เช่น การคำนวณลำดับชั้นขององค์กร หรือการหาเส้นทางในกราฟ) เราจะใช้ Recursive Common Table Expressions (CTE) ซึ่งทำหน้าที่เหมือนกับการวนซ้ำแบบ While Loop ที่มีขอบเขตชัดเจน ทำให้เราสามารถจัดการกับข้อมูลที่มีความสัมพันธ์กันเป็นโครงสร้างต้นไม้ได้อย่างสมบูรณ์

SQL

-- ตัวอย่าง: การหาลำดับชั้น (Hierarchy) ของพนักงาน
WITH RECURSIVE employee_hierarchy AS (
    SELECT employee_id, manager_id, name, 1 AS level
    FROM employees
    WHERE manager_id IS NULL -- Anchor Member (จุดเริ่มต้น)

    UNION ALL

    SELECT e.employee_id, e.manager_id, e.name, eh.level + 1
    FROM employees e
    JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id -- Recursive Member (การวนซ้ำ)
)
SELECT * FROM employee_hierarchy;

สรุป: การออกแบบตรรกะที่แข็งแกร่ง

การเชี่ยวชาญเครื่องมือเหล่านี้ ไม่ว่าจะเป็น CASE WHEN สำหรับการตัดสินใจ, generate_series() สำหรับการวนซ้ำเชิงตัวเลข และ Recursive CTEs สำหรับการจัดการโครงสร้างความสัมพันธ์ คือสิ่งที่แยก Senior Developer ออกจาก Junior Developer ได้อย่างชัดเจน การใช้ตรรกะที่ถูกต้องในระดับฐานข้อมูล (Database Logic) ไม่เพียงแต่ทำให้โค้ดของเราทำงานได้เท่านั้น แต่ยังช่วยให้ระบบมีความเป็น Atomic, Maintainable และสามารถขยายขนาดได้อย่างมีประสิทธิภาพสูงสุด