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

MySQL: SELECT DISTINCT แบบ Case-Insensitive ด้วย UPPER/LOWER

คำสั่ง DISTINCT ใน MySQL เริ่มต้นเป็น Case-Sensitive (แยก 'John' และ 'john') หากต้องการ Case-Insensitive DISTINCT ให้ใช้ UPPER() หรือ LOWER() ก่อน

รูปแบบคำสั่ง

วิธีที่ 1: ใช้ UPPER()

SELECT DISTINCT UPPER(column_name) FROM table_name;

วิธีที่ 2: ใช้ LOWER()

SELECT DISTINCT LOWER(column_name) FROM table_name;

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

1. สร้างตารางและเพิ่มอีเมลที่ต่าง case

CREATE TABLE CaseInsensitiveDistinctDemo (
    Id INT NOT NULL AUTO_INCREMENT,
    UserEmailId VARCHAR(30),
    UserPassword VARCHAR(10),
    PRIMARY KEY (Id)
);

INSERT INTO CaseInsensitiveDistinctDemo (UserEmailId, UserPassword) VALUES
('John@gmail.com', 'john123'),
('john@gmail.com', '654321'),
('Mike@gmail.com', '999999'),
('mike@gmail.com', '334556'),
('Carol@gmail.com', '1010101'),
('Larry@gmail.com', '12345678');

ข้อมูลในตาราง (มี John/john และ Mike/mike):

+----+-----------------+--------------+
| Id | UserEmailId     | UserPassword |
+----+-----------------+--------------+
|  1 | John@gmail.com  | john123      |
|  2 | john@gmail.com  | 654321       |
|  3 | Mike@gmail.com  | 999999       |
|  4 | mike@gmail.com  | 334556       |
|  5 | Carol@gmail.com | 1010101      |
|  6 | Larry@gmail.com | 12345678     |
+----+-----------------+--------------+

2. DISTINCT แบบ Case-Insensitive ด้วย UPPER()

SELECT DISTINCT UPPER(UserEmailId) FROM CaseInsensitiveDistinctDemo;

ผลลัพธ์:

+--------------------+
| UPPER(UserEmailId) |
+--------------------+
| JOHN@GMAIL.COM     |
| MIKE@GMAIL.COM     |
| CAROL@GMAIL.COM    |
| LARRY@GMAIL.COM    |
+--------------------+
4 rows in set

3. DISTINCT แบบ Case-Insensitive ด้วย LOWER()

SELECT DISTINCT LOWER(UserEmailId) FROM CaseInsensitiveDistinctDemo;

ผลลัพธ์:

+--------------------+
| LOWER(UserEmailId) |
+--------------------+
| john@gmail.com     |
| mike@gmail.com     |
| carol@gmail.com    |
| larry@gmail.com    |
+--------------------+
4 rows in set

เปรียบเทียบ: DISTINCT ปกติ vs Case-Insensitive

-- Case-Sensitive (ค่าเริ่มต้น) - ได้ 6 แถว
SELECT DISTINCT UserEmailId FROM CaseInsensitiveDistinctDemo;

-- Case-Insensitive - ได้ 4 แถว
SELECT DISTINCT LOWER(UserEmailId) FROM CaseInsensitiveDistinctDemo;

การใช้งานใน WHERE / JOIN

-- หา user โดยไม่สนใจ case
SELECT * FROM users WHERE LOWER(email) = LOWER('JOHN@GMAIL.COM');

-- JOIN แบบ case-insensitive
SELECT * FROM table1 t1
JOIN table2 t2 ON LOWER(t1.email) = LOWER(t2.email);

ทางเลือก: ใช้ Collation Case-Insensitive

กำหนด Collation ให้คอลัมน์/ตาราง/ฐานข้อมูล:

-- ระดับคอลัมน์
ALTER TABLE users MODIFY email VARCHAR(100) COLLATE utf8mb4_general_ci;

-- ระดับตาราง
CREATE TABLE users (...) DEFAULT COLLATE utf8mb4_general_ci;

-- _ci = case insensitive, _cs = case sensitive, _bin = binary

ถ้า Collation เป็น _ci แล้ว DISTINCT จะเป็น Case-Insensitive อัตโนมัติ

สรุป

  • Ad-hoc query: ใช้ DISTINCT LOWER(col) หรือ DISTINCT UPPER(col)
  • Permanent: ตั้ง Collation ให้เป็น _ci (เช่น utf8mb4_general_ci)
  • JOIN/WHERE: ใช้ LOWER(col1) = LOWER(col2) หรือพึ่งพา Collation