所以我有一个user表,其中user.username有许多重复项,如:
username
以及Username
和useRnAme
john
和John
以及jOhn
这是一个错误,这三个记录应该只有一个。
我正在尝试提出一个SQL查询,列出按创建日期排序的所有这些案例,理想情况下结果应该是这样的:
username jan01
useRnAme jan02
Username jan03
john feb01
John feb02
jOhn feb03
任何建议都将不胜感激
答案 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