Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การค้นหาข้อมูลแบบละเว้นอักขระด้วย REPLACE ใน MySQL

ใช้ REPLACE() เพื่อกำจัดอักขระที่ไม่ต้องการ (เช่น จุด) ก่อนเปรียบเทียบ

สร้างตารางตัวอย่าง

mysql> create table DemoTable ( 
    Name varchar(40) ) ; 
Query OK, 0 rows affected (0.63 sec)

เพิ่มข้อมูลตัวอย่าง

mysql> insert into DemoTable values('John.Smith'); Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable values('Chris Brown'); Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('Chris.Brown'); Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('David Miller'); Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values('Chris.Taylor'); Query OK, 1 row affected (0.18 sec)

แสดงข้อมูลทั้งหมด

mysql> select *from DemoTable;
+--------------+
| Name         |
+--------------+
| John.Smith   |
| Chris Brown  |
| Chris.Brown  |
| David Miller |
| Chris.Taylor |
+--------------+
5 rows in set (0.00 sec)

คิวรี่ค้นหา "Chris Brown" โดยละเว้นจุด

mysql> select *from DemoTable where replace(Name,'.','')='Chris Brown';

ผลลัพธ์ (เจอแค่ "Chris Brown" ตรงตัว และ "Chris.Brown" หลังลบจุด):

+-------------+
| Name        |
+-------------+
| Chris Brown |
| Chris.Brown |
+-------------+
2 rows in set (0.00 sec)

คำอธิบาย

  • REPLACE(Name, '.', '') ลบจุดทุกตัวออกจาก Name ก่อนเปรียบเทียบ
  • จับคู่ได้ทั้ง "Chris Brown" (ไม่มีจุด) และ "Chris.Brown" (มีจุด)
  • "Chris.Taylor" ไม่จับคู่ เพราะหลังลบจุดเป็น "ChrisTaylor"

ข้อจำกัดด้านประสิทธิภาพ

ใช้ฟังก์ชันบนคอลัมน์ (REPLACE(Name, ...)) ทำให้ ไม่ใช้ Index ได้ (Non-sargable)

แนวทางแก้ไข

  • Normalize ข้อมูล: เก็บค่าที่ Clean ไว้ในคอลัมน์แยก (Generated Column)
  • ADD clean_name VARCHAR(40) GENERATED ALWAYS AS (REPLACE(Name, '.', '')) STORED
  • Full-Text Search: ใช้ MATCH() AGAINST() แทน
  • Application Layer: Clean ก่อน Query

ตัวอย่าง Generated Column (MySQL 5.7+)

ALTER TABLE DemoTable 
ADD COLUMN clean_name VARCHAR(40) 
GENERATED ALWAYS AS (REPLACE(Name, '.', '')) STORED;

CREATE INDEX idx_clean_name ON DemoTable(clean_name);

SELECT * FROM DemoTable WHERE clean_name = 'Chris Brown';