2010-04-22 104 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