คำสั่ง 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