MySQL การใช้งานฟังก์ชัน SUBSTRING_INDEX()

ฟังก์ชัน SUBSTRING_INDEX() ใช้สำหรับตัดข้อความย่อยจาก string โดยอิงจาก “ตัวคั่น” (delimiter) โดยจะคืนค่าข้อความ ก่อน หรือ หลัง ตัวคั่น ตามจำนวนที่กำหนด มีความสามารถพิเศษเหนือ SUBSTRING() เพราะใช้ delimiter แทนตำแหน่งตัวอักษร

ประโยชน์ของฟังก์ชัน SUBSTRING_INDEX()

  • ใช้แยกค่าจากข้อความที่มีตัวคั่น เช่น
    • แยกชื่อ domain จาก email
    • แยกคำหน้าหลังจากชื่อ-นามสกุล
    • แยกปี/เดือน/วันจากวันที่ในรูปแบบ string
  • เหมาะกับข้อมูลที่เก็บรวมกันในฟิลด์เดียว เช่น 'ชื่อ-นามสกุล', 'A,B,C', '1.2.3'

รูปแบบการใช้งาน

SUBSTRING_INDEX(str, delimiter, count)
  • str คือข้อความต้นฉบับ
  • delimiter คือตัวคั่น (เช่น '-', ',', '@')
  • count คือจำนวน delimiter ที่ต้องการพิจารณา
    • ถ้า count มากกว่า 0 จะคืนค่าจากทาง ซ้าย ถึง delimiter ที่ n
    • ถ้า count น้อยกว่า 0 จะคืนค่าจากทาง ขวา ถึง delimiter ที่ n (นับจากขวา)

ตัวอย่างการใช้งาน

แยกชื่อ domain จากอีเมล

SQL
SELECT SUBSTRING_INDEX('[email protected]', '@', -1);  
-- ผลลัพธ์: 'example.com'

แยกชื่อผู้ใช้จากอีเมล

SQL
SELECT SUBSTRING_INDEX('[email protected]', '@', 1);  
-- ผลลัพธ์: 'user'

แยกชื่อจากชื่อ-นามสกุล

SQL
SELECT SUBSTRING_INDEX('Somchai Jaidee', ' ', 1);  
-- ผลลัพธ์: 'Somchai'

แยกนามสกุล

SQL
SELECT SUBSTRING_INDEX('Somchai Jaidee', ' ', -1);  
-- ผลลัพธ์: 'Jaidee'

แยกวันจากวันที่ในรูปแบบ string

SQL
SELECT SUBSTRING_INDEX('2024-04-02', '-', -1);  
-- ผลลัพธ์: '02'

สมมุติว่า email ของลูกค้าอยู่ในรูปแบบ [email protected] ต้องการแยกเฉพาะชื่อ (ซึ่งอยู่ก่อน .)

SQL
SELECT email,
       SUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', 1), '.', 1) AS first_name_guess
FROM customer
LIMIT 5;
  • สมมุติว่าอีเมลเป็น [email protected]
  • SUBSTRING_INDEX(email, '@', 1) จะแยกชื่อผู้ใช้ก่อน @ เช่น 'john.smith'
  • จากนั้นใช้ SUBSTRING_INDEX(..., '.', 1) เพื่อตัดเอา 'john'
แชร์เรื่องนี้