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

ค้นหาแบบ Case-Insensitive ด้วย IN() ใน MySQL ใช้ UPPER()/LOWER()

ภาพรวม

MySQL Default Collation เป็น Case-Insensitive (ci) แล้ว แต่หากต้องการบังคับหรือใช้กับ Binary Collation ให้ใช้ UPPER() หรือ LOWER() ทั้งคอลัมน์และค่าใน IN()

ตัวอย่างสมบูรณ์

1. สร้างตารางและข้อมูล

CREATE TABLE DemoTable1460 (Name VARCHAR(20));

INSERT INTO DemoTable1460 VALUES ('Chris');
INSERT INTO DemoTable1460 VALUES ('David');
INSERT INTO DemoTable1460 VALUES ('Bob');
INSERT INTO DemoTable1460 VALUES ('Robert');

2. Query: Case-Insensitive Search ด้วย UPPER()

SELECT * FROM DemoTable1460 
WHERE UPPER(Name) IN ('CHRIS', 'BOB');

3. ผลลัพธ์ (จับ 'Chris' และ 'Bob' ไม่สนใจ Case)

+-------+
| Name  |
+-------+
| Chris |
| Bob   |
+-------+

วิธีต่างๆ สำหรับ Case-Insensitive

วิธีตัวอย่างหมายเหตุ
UPPER() ทั้งสองฝั่งWHERE UPPER(col) IN ('A','B')มาตรฐาน ANSI
LOWER() ทั้งสองฝั่งWHERE LOWER(col) IN ('a','b')เหมือน UPPER
COLLATE ..._ciWHERE col COLLATE utf8mb4_general_ci IN ('a','b')ระบุ Collation
Default CollationWHERE col IN ('a','b')ถ้า Table เป็น _ci แล้ว

ประสิทธิภาพ

  • UPPER(col) / LOWER(col) → ไม่ใช้ Index (Function on column)
  • หาก Table ใหญ่ ควร:
    • ใช้ Collation _ci ตั้งแต่สร้างตาราง
    • เพิ่ม Computed/Generated Column: name_upper VARCHAR(20) GENERATED ALWAYS AS (UPPER(Name)) STORED แล้ว Index คอลัมน์นั้น
    • MySQL 8.0+: Functional Index INDEX idx_upper ((UPPER(Name)))

ตัวอย่าง Functional Index (MySQL 8.0+)

CREATE TABLE DemoTable1460 (
    Name VARCHAR(20),
    INDEX idx_name_upper ((UPPER(Name)))
);

-- Query นี้จะใช้ Index ได้
SELECT * FROM DemoTable1460 WHERE UPPER(Name) IN ('CHRIS', 'BOB');

สรุป

ใช้ WHERE UPPER(column) IN ('VAL1', 'VAL2') สำหรับ Case-Insensitive Search กับ IN() แต่ระวัง Index ใช้ Functional Index (MySQL 8.0+) หรือ Generated Column แทน