ฟังก์ชัน 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'