16

所以我有一个用户表,其中 user.username 有很多重复项,例如:

usernameUsernameuseRnAme
johnJohnjOhn

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

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

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

任何建议将不胜感激

4

6 回答 6

35

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

 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 的大写转换函数中包装除第一次出现的用户名之外的所有内容:

 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
于 2010-04-22T20:15:40.803 回答
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
)
于 2010-04-22T20:18:32.340 回答
0

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

于 2010-04-22T20:12:47.597 回答
0

在 MySQL 中,区分大小写的比较是使用二进制排序规则完成的。因此,您可以自行加入表,查找区分大小写比较与不区分大小写比较不同的行:

select *
from YourTable t1
inner join YourTable t2 
on t1.name <> t2.name collate latin1_bin
and t1.name = t2.name
于 2010-04-22T20:16:10.020 回答
0
SELECT UserName, CreatedDate
FROM YourTable 
WHERE UserName COLLATE UTF8_BIN != LOWER(UserName COLLATE UTF8_BIN)
GROUP BY UserName, CreatedDate
HAVING COUNT(*) > 1
于 2017-05-23T03:53:29.943 回答
-1

所以这就是我想出的。这是针对 postgres db 编写的,但对于其他 sql 引擎应该仍然可以正常工作。

select * from user u join user u2
on upper(u.email)=upper(u2.email) where u.id != u2.id
order by u.email;

因此查询假定电子邮件是重复的,但 ID 不是,因此它正在寻找具有重复电子邮件(不区分大小写)但具有唯一 ID 的记录

于 2022-02-07T14:53:27.217 回答