不区分大小写的重复SQL

时间:2010-04-22 20:08:24

标签: sql mysql postgresql duplicate-data

所以我有一个user表,其中user.username有许多重复项,如:

username以及UsernameuseRnAme
johnJohn以及jOhn

这是一个错误,这三个记录应该只有一个。

我正在尝试提出一个SQL查询,列出按创建日期排序的所有这些案例,理想情况下结果应该是这样的:

username jan01
useRnAme jan02
Username jan03
john     feb01 
John     feb02
jOhn     feb03

任何建议都将不胜感激

5 个答案:

答案 0 :(得分:27)

暂时不考虑区分大小写的问题,基本策略是:

 SELECT username, create_date FROM your_table
     WHERE username IN 
     (SELECT username FROM your_table GROUP BY username HAVING COUNT(*) > 1)
 ORDER BY username, create_date

许多RDBMS(包括MySQL假设您使用CHAR或VARCHAR作为用户名列),默认情况下执行不区分大小写的搜索。对于这些数据库,上述解决方案将起作用。要解决其他产品的区分大小写问题,请在特定于RDBMS的大写转换函数中包装除第一次出现的username之外的所有内容:

 SELECT username, create_date FROM your_table
     WHERE UPPER(username) IN 
     (SELECT UPPER(username) FROM your_table GROUP BY UPPER(username) HAVING COUNT(*) > 1)
 ORDER BY username, create_date

答案 1 :(得分:1)

尝试类似这样的事情

SELECT UserName, CreatedDate
FROM User
WHERE LOWER(TRIM(UserName)) IN 
(
SELECT LOWER(TRIM(UserName))
FROM User
GROUP BY LOWER(TRIM(UserName))
HAVING count(*) > 1
)

答案 2 :(得分:0)

在SELECT中使用ToLower()或等效函数,并按该列排序。

答案 3 :(得分:0)

在MySQL中,使用二进制排序规则进行区分大小写的比较。因此,您可以将表连接到自身,查找区分大小写的比较与不区分大小写的比较不同的行:

select *
from YourTable t1
inner join YourTable t2 
on t1.name <> t2.name collate latin1_bin
and t1.name = t2.name

答案 4 :(得分:0)

SELECT UserName, CreatedDate
FROM YourTable 
WHERE UserName COLLATE UTF8_BIN != LOWER(UserName COLLATE UTF8_BIN)
GROUP BY UserName, CreatedDate
HAVING COUNT(*) > 1