2,094   การใช้คำสั่ง mysql substring_index เพื่อคัดแยก title ,firstname ,lastname จาก Column

โจทย์ :: จงคัดแยก title, firstname, lastname, sex โดยที่ (ถ้า title= Mr. ให้แสดง 'ชาย'ถ้า title = Miss ให้แสดง 'หญิง')

:: ตัวอย่างข้อมูล ::

:: ผลลัพธ์ที่ต้องการ ::

:::::::::::: เฉลย ::::::::::::

สร้าง Table ชื่อ employee(SQL)

DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(250) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`salary` double DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;


INSERT INTO `employee` VALUES ('1', 'Mr. Adam Johnson', '27', '36000');
INSERT INTO `employee` VALUES ('2', 'Miss Natacha Smith', '32', '40000');
INSERT INTO `employee` VALUES ('3', 'Mr. John wasson', '45', '60000');
INSERT INTO `employee` VALUES ('4', 'Mr. Andy Davic', '35', '56000');

 

ทดสอบการ select ข้อมูลตามโจทย์ (SQL)

SELECT
	this_.id as "Id"
	, substring_index(this_.`name`,' ',1) as "Title"
	, substring_index(substring_index(this_.`name`, ' ', 2), ' ', -1) as "Firstname"
	, substring_index(this_.`name`,' ',-1) as "Lastname"
	, (
		CASE substring_index(this_.`name`,' ',1) -- ถ้าข้อมูลชุดนี้
			WHEN 'Mr.' THEN 'ชาย' -- เงื่อนไขที่ 1 = 'Mr.' THEN ให้แสดง 'ชาย'
			WHEN 'Miss' THEN 'หญิง' -- เงื่อนไขที่ 2 = 'Miss' THEN ให้แสดง 'หญิง'
		END
		)as "Sex"
	, this_.age as "Age"
	, this_.salary as "Salary"
FROM `employee` this_

 

อธิบายคำสั่ง 

substring_index(str, delim, count)

จากโค้ดเดิมข้างบน

substring_index(this_.`name`, ' ', 1)

/* substring_index(คอลัมน์ที่ต้องการแยกข้อมูล, แยกด้วยอะไร , ตั้งแต่ index ที่ 0 ถึง index ที่เท่าไหร่) */

 

ตัวอย่างเช่น this_.`name` = Mr. Adam Johnson หากเราใช้คำสั่ง substring_index 

ผลลัพธ์ที่ได้จากคำสั่ง

/* กรณีที่เราเข้าถึง index เป็นค่า + คำสั่งจะแยกข้อมูลจาก หน้า --> หลัง */
/* แต่ถ้าเราเข้าถึง index เป็นค่า - คำสั่งจะแยกข้อมูลจาก หลัง --> หน้า */

substring_index(this_.`name`, ' ', 1)
Result: Mr.

substring_index(this_.`name`, ' ', 2)
Result: Mr. Adam

substring_index(this_.`name`, ' ', 3)
Result: Mr. Adam Johnson

substring_index(this_.`name`, ' ', -1)
Result: Johnson

substring_index(this_.`name`, ' ', -2)
Result: Adam Johnson

substring_index(this_.`name`, ' ', -3)
Result: Mr. Adam Johnson

substring_index(this_.`name`, ' ', 0)
Result: ก็จะแสดงค่าว่าง เนื่องจาก index ช่องที่ 0 ไม่มีอะไรเลย
 
ปล. ส่วนตรง Firstname เป็นการประยุกต์คำสั่งนั่นก็คือ substring_index ซ้อน substring_index ต้องลองศึกษาด้วยตนเองอีกทีครับ

::: ไม่ยากอย่างที่คิดเลยไช่ไหมครับ
Back to Top