ทำความรู้จักการแปลงข้อมูลใน MS-SQL
เวลาเราเขียนโปรแกรม MS-SQL (ฐานข้อมูลของ Microsoft) ข้อมูลแต่ละช่องมักจะมีประเภทของมัน เช่น ตัวเลข หรือ ข้อความ บางครั้งเราได้รับข้อมูลมาผิดประเภท ทำให้เอาไปคำนวณต่อไม่ได้ เราจึงต้องมีวิธีเปลี่ยนประเภทข้อมูลให้ถูกต้อง Data Conversion (การแปลงประเภทข้อมูล) คือหัวใจสำคัญของการเตรียมข้อมูลก่อนนำไปใช้งานจริง ลองนึกภาพว่าคุณมีกล่องใส่ของที่ติดป้ายว่า "ตัวเลข" แต่ดันมีคนเอา "ข้อความ" ใส่ลงไป ถ้าคุณพยายามเอาเครื่องคิดเลขไปบวกข้อความนั้น โปรแกรมจะพังทันที การแปลงข้อมูลเปรียบเสมือนการตรวจสอบป้ายหน้ากล่องแล้วเปลี่ยนให้ตรงกับสิ่งของข้างใน เพื่อให้ระบบทำงานได้อย่างราบรื่นโดยไม่เกิดข้อผิดพลาด ในฐานะโปรแกรมเมอร์มือใหม่ คุณจะเจอปัญหานี้บ่อยมากเวลาดึงข้อมูลจากหลายแหล่งมารวมกัน บางระบบเก็บตัวเลขเป็นข้อความ บางระบบเก็บวันที่เป็นตัวเลข การเข้าใจวิธีใช้คำสั่งพื้นฐานจะช่วยให้คุณจัดการข้อมูลได้แม่นยำขึ้น และลดบั๊ก (จุดผิดพลาดของโปรแกรม) ที่เกิดจากการเปรียบเทียบข้อมูลคนละประเภทได้เป็นอย่างดี
ใช้ CAST() และ CONVERT() เปลี่ยนประเภทข้อมูล
คำสั่ง CAST() และ CONVERT() มีหน้าที่เหมือนกันคือการเปลี่ยนประเภทข้อมูล แต่ CONVERT() จะยืดหยุ่นกว่าเพราะกำหนดรูปแบบการแสดงผลได้ เช่น การแปลงวันที่ให้เป็นรูปแบบที่อ่านง่าย คำสั่งเหล่านี้เป็นมาตรฐานที่คุณต้องใช้ทุกวันในการทำงานจริง CAST() เขียนง่ายและเป็นมาตรฐานสากล ส่วน CONVERT() เป็นความสามารถเฉพาะของ SQL Server ที่เก่งเรื่องการจัดการรูปแบบวันที่และเวลา ถ้าคุณต้องการแปลงค่าแบบทั่วไปให้ใช้ CAST() แต่ถ้าต้องจัดการกับวันที่ที่ซับซ้อนให้เลือกใช้ CONVERT() จะดีกว่า จุดที่มือใหม่มักพลาดคือการแปลงข้อมูลที่ "เป็นไปไม่ได้" เช่น พยายามแปลงข้อความ "ABC" ให้เป็นตัวเลข ซึ่งจะทำให้โปรแกรมหยุดทำงานทันที ดังนั้นก่อนใช้คำสั่งเหล่านี้ คุณต้องมั่นใจว่าข้อมูลต้นทางมีรูปแบบที่สามารถแปลงเป็นปลายทางได้จริง
-- ตัวอย่างการใช้ CAST และ CONVERT
SELECT CAST(123.45 AS INT) AS Result1; -- แปลงเลขทศนิยมเป็นเลขจำนวนเต็ม
SELECT CONVERT(VARCHAR, GETDATE(), 103) AS Result2; -- แปลงวันที่เป็นข้อความรูปแบบ dd/mm/yyyy
คำอธิบายโค้ด: 1. บรรทัดแรกใช้ CAST เปลี่ยนเลขทศนิยมให้กลายเป็นเลขจำนวนเต็ม โดยค่าทศนิยมจะถูกตัดทิ้ง 2. บรรทัดที่สองใช้ CONVERT แปลงวันที่ปัจจุบัน (GETDATE()) ให้เป็นข้อความในรูปแบบที่คนไทยคุ้นเคยคือ วัน/เดือน/ปี ผลลัพธ์ที่ควรเห็น: - Result1 จะได้ค่าเป็น 123 - Result2 จะได้วันที่ปัจจุบันในรูปแบบ 20/05/2024 (ตัวอย่างสมมติ)
ป้องกันโปรแกรมพังด้วย TRY_CONVERT()
ในการทำงานจริง ข้อมูลในฐานข้อมูลมักจะไม่สะอาดเสมอไป บางครั้งมีค่าว่างหรือข้อความแปลกปลอมปนมา Exception (เหตุการณ์ที่ทำให้โปรแกรมหยุดทำงานกะทันหัน) มักจะเกิดขึ้นถ้าเราใช้ CAST() หรือ CONVERT() แบบปกติกับข้อมูลที่แปลงไม่ได้ คำสั่ง TRY_CONVERT() จึงถูกสร้างมาเพื่อแก้ปัญหานี้โดยเฉพาะ ถ้าการแปลงข้อมูลสำเร็จ มันจะแสดงค่าที่แปลงได้ แต่ถ้าการแปลงล้มเหลว มันจะไม่พ่น Error (ข้อความแจ้งเตือนความผิดพลาด) ออกมา แต่จะส่งค่า NULL (ค่าว่างหรือไม่มีข้อมูล) กลับมาให้แทน ซึ่งปลอดภัยกว่ามาก มือใหม่หลายคนมักจะชะล่าใจและใช้ CAST() กับทุกอย่าง จนกระทั่งเจอข้อมูลขยะในระบบแล้วโปรแกรมล่มกลางทาง การใช้ TRY_CONVERT() จะช่วยให้โค้ดของคุณมีความทนทาน (Robust) และทำงานต่อได้แม้จะเจอข้อมูลที่ไม่คาดคิด
-- ตัวอย่างการใช้ TRY_CONVERT
SELECT TRY_CONVERT(INT, '123') AS Success; -- แปลงได้ปกติ
SELECT TRY_CONVERT(INT, 'ABC') AS Failed; -- แปลงไม่ได้จะได้ NULL
คำอธิบายโค้ด: 1. บรรทัดแรกแปลงข้อความ '123' เป็นตัวเลข ซึ่งทำได้สำเร็จ 2. บรรทัดที่สองพยายามแปลงข้อความ 'ABC' เป็นตัวเลข ซึ่งทำไม่ได้ ระบบจึงคืนค่าเป็น NULL แทนการแสดงข้อความแจ้งเตือนความผิดพลาด ผลลัพธ์ที่ควรเห็น: - Success จะได้ค่าเป็น 123 - Failed จะได้ค่าเป็น NULL
สร้างเงื่อนไขด้วย IIF()
เมื่อข้อมูลพร้อมแล้ว ต่อมาคือการตัดสินใจในโค้ด Logic Control (การควบคุมตรรกะหรือเงื่อนไข) ช่วยให้โปรแกรมเลือกทำอย่างใดอย่างหนึ่งตามเงื่อนไขที่กำหนด IIF() เป็นคำสั่งที่สั้นและเข้าใจง่ายที่สุด เหมือนกับการเขียนเงื่อนไขแบบ "ถ้า...ทำนี่...ไม่งั้น...ทำนั่น" การใช้ IIF() เหมาะกับเงื่อนไขที่ไม่ซับซ้อน เช่น การตรวจสอบว่ายอดขายถึงเป้าไหม หรือการเช็คว่าข้อมูลเป็นค่าว่างหรือไม่ ถ้าคุณมีเงื่อนไขแค่สองทางเลือก IIF() คือเพื่อนที่ดีที่สุดของคุณเพราะโค้ดจะดูสะอาดและอ่านง่าย ข้อควรระวังคืออย่าใส่ IIF() ซ้อนกันหลายชั้น เพราะจะทำให้โค้ดอ่านยากมาก (คนเขียนเองจะงงในภายหลัง) หากเงื่อนไขเริ่มเยอะเกินสองทางเลือก ให้เปลี่ยนไปใช้คำสั่งที่ทรงพลังกว่าอย่าง CASE WHEN แทน
-- ตัวอย่างการใช้ IIF
SELECT IIF(100 > 50, 'ผ่าน', 'ไม่ผ่าน') AS Result; -- ตรวจสอบเงื่อนไข
คำอธิบายโค้ด: 1. บรรทัดแรกคือการตรวจสอบว่า 100 มากกว่า 50 หรือไม่ 2. ถ้าเงื่อนไขเป็นจริง (True) จะแสดงผลว่า 'ผ่าน' 3. ถ้าเงื่อนไขเป็นเท็จ (False) จะแสดงผลว่า 'ไม่ผ่าน' ผลลัพธ์ที่ควรเห็น: - คอลัมน์ Result จะแสดงผลเป็น 'ผ่าน'
เขียนเงื่อนไขซับซ้อนด้วย CASE WHEN
เมื่อคุณต้องเจอเงื่อนไขหลายระดับ เช่น การแบ่งเกรดนักเรียน หรือการจัดกลุ่มสินค้าตามราคา CASE WHEN คือเครื่องมือหลักที่โปรแกรมเมอร์ใช้ มันมีความยืดหยุ่นสูงและอ่านง่ายกว่า IIF() หลายเท่าตัว การทำงานของ CASE WHEN คือการไล่เช็คเงื่อนไขจากบนลงล่าง ถ้าเจออันไหนตรงตามเงื่อนไขก็จะหยุดทำงานทันที คุณสามารถใส่เงื่อนไขกี่ข้อก็ได้ และยังมีช่อง ELSE ไว้สำหรับกรณีที่ไม่มีเงื่อนไขไหนตรงเลย มือใหม่มักลืมใส่คำสั่ง END ปิดท้าย ทำให้คำสั่งทำงานไม่สมบูรณ์ หรือลืมใส่ ELSE ทำให้เกิดค่า NULL โดยไม่ตั้งใจ ดังนั้นฝึกให้เป็นนิสัยว่าทุกครั้งที่เปิด CASE ต้องปิดด้วย END เสมอ
-- ตัวอย่างการใช้ CASE WHEN
SELECT ProductPrice,
CASE
WHEN ProductPrice < 100 THEN 'ราคาประหยัด'
WHEN ProductPrice BETWEEN 100 AND 500 THEN 'ราคาปานกลาง'
ELSE 'ราคาสูง'
END AS PriceCategory
FROM Products;
คำอธิบายโค้ด: 1. เช็คราคา ProductPrice ถ้าต่ำกว่า 100 ให้จัดเป็น 'ราคาประหยัด' 2. ถ้าอยู่ระหว่าง 100 ถึง 500 ให้จัดเป็น 'ราคาปานกลาง' 3. ถ้าไม่เข้าเงื่อนไขข้างต้นเลย (เกิน 500) ให้ถือว่าเป็น 'ราคาสูง' 4. END ใช้ปิดการเขียนเงื่อนไขทั้งหมด ผลลัพธ์ที่ควรเห็น: - ตารางจะแสดงราคาพร้อมกลุ่มราคาที่แบ่งไว้ตามเงื่อนไขที่กำหนด
สรุป: เอาไปใช้ในงานจริงอย่างไร
การเรียนรู้เรื่องการแปลงข้อมูลและเงื่อนไขไม่ใช่แค่การจำคำสั่ง แต่คือการเตรียมตัวเป็นโปรแกรมเมอร์ที่แก้ปัญหาได้จริง ในงานสายนี้คุณจะต้องทำรายงาน (Report) หรือดึงข้อมูลไปแสดงผลในหน้าเว็บตลอดเวลา ซึ่งข้อมูลดิบมักไม่พร้อมใช้งานเสมอ สมมติว่าคุณกำลังทำระบบร้านค้าออนไลน์ คุณได้รับโจทย์ให้แสดงสถานะคำสั่งซื้อจากฐานข้อมูล ถ้าค่าเป็น 1 ให้แสดงว่า "รอชำระเงิน" ถ้าเป็น 2 ให้แสดงว่า "ส่งของแล้ว" และถ้าเป็นอย่างอื่นให้แสดงว่า "ยกเลิก" คุณสามารถใช้ CASE WHEN แปลงค่า 1, 2 ให้เป็นข้อความที่ลูกค้าอ่านเข้าใจได้ทันที การฝึกฝนคำสั่งเหล่านี้จะทำให้คุณมีความมั่นใจมากขึ้นเวลาต้องจัดการกับฐานข้อมูลจริง จงจำไว้ว่าโปรแกรมเมอร์ที่เก่ง ไม่ใช่คนที่จำคำสั่งได้ทั้งหมด แต่คือคนที่รู้วิธีเลือกเครื่องมือมาใช้แก้ปัญหาได้ถูกต้องและปลอดภัยที่สุด เริ่มต้นจากโปรเจกต์เล็กๆ แล้วลองเปลี่ยนประเภทข้อมูลหรือใส่เงื่อนไขดู แล้วคุณจะพบว่างานฐานข้อมูลไม่ได้ยากอย่างที่คิดครับ