16

したがって、user.usernameに次のような多くの重複があるusersテーブルがあります。

usernameそしてUsernameそしてuseRnAme
johnそしてJohnそしてjOhn

これはバグで、これら 3 つのレコードは 1 つのみである必要がありました。

これらすべてのケースを作成日順に並べた 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 (ユーザー名列に CHAR または VARCHAR を使用していると仮定した MySQL を含む) は、デフォルトで大文字と小文字を区別しない検索を実行します。これらのデータベースでは、上記のソリューションが機能します。他の製品の大文字と小文字の区別の問題を解決するには、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 に答える
-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 に答える