2010-04-22 96 views
9

所以我有一个用户表,其中user.username有很多重复,如:不区分大小写重复SQL

usernameUsernameuseRnAme
johnJohnjOhn

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

我试图拿出一个SQL查询,列出了所有的这些情况通过他们的创作日期排序,所以理想的结果应该是这样的:

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

任何建议将非常感激

+1

@hdx:你的问题被标记为'mysql'和'postgresql'。你在使用两者吗? – 2010-04-22 20:12:19

+0

@hdx:你实际上是以这种格式存储日期,而不是日期列? – 2010-04-22 20:13:13

+0

@Peter Lang,其实任何sql语言都可以,我可以移植它。我正在使用postgresql。 – hdx 2010-04-22 20:15:01

回答

22

撇开区分大小写的问题了一会儿,基本策略是:

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的username列),执行不区分大小写默认搜索。对于这些数据库,上述解决方案将起作用。为了解决对其他产品的区分大小写问题,包以外的所有用户名的特定于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 
+0

如果是MYSQL,则不需要UPPER,甚至可能使查询速度变慢。 – 2010-04-22 20:23:13

+0

是的,这是真的(对于其他各种RDBMS也是如此)。我会修改答案以反映这一点。 – 2010-04-22 20:31:19

+0

确定+1为更新。 – 2010-04-22 20:34:37

0

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

+0

这将包括不会遭受多入口问题的用户名。 – 2010-04-22 20:16:12

0

在MySQL中,一个区分大小写的比较是使用二进制排序完成。所以,你可以加入表本身,寻找行,其中比较敏感的情况下是不区分大小写不同的比较:

select * 
from YourTable t1 
inner join YourTable t2 
on t1.name <> t2.name collate latin1_bin 
and t1.name = t2.name 
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 
) 
+0

Opps,我看到Larry第一次发布了相同的东西 – 2010-04-22 20:20:26

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

**来自评论队列**:我可以请求您在源代码中添加一些上下文。仅有代码的答案很难理解。如果您可以在帖子中添加更多信息,它可以帮助提问者和未来的读者。 – RBT 2017-05-23 08:00:48