2010-04-22 18 views
9

var SQL Kayıtlar sadece bir tane olmalıydı.Vaka duyarsız çiftleri yüzden user.username gibi birçok çiftleri olan bir kullanıcılar tablo

Onların oluşturma tarihine göre sıralı Tüm bu durumlarda listeleyen SQL sorgusu ile gelip çalışıyorum, yani ideal sonuç böyle bir şey olmalı: Herhangi bir öneriniz çok takdir edilecektir

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

+1

@hdx gibi bir şey deneyin: Sizin soru 'mysql' ve' postgresql' olarak etiketlenmiştir. Ikisini de kullanıyor musunuz –

+0

@hdx: Tarihi bir tarih sütunda değil, bu formatta saklıyor musunuz? –

+0

@Peter Lang, aslında herhangi bir sql dili gibi yapabildiğini söyleyebilirim. Postgresql kullanıyorum. – hdx

cevap

22

bir an için küçük harf duyarlılığı konusunu bir kenara bırakırsak, temel stratejidir: (MySQL kullanıcı adı sütun için CHAR veya VARCHAR kullandığınızı varsayarak dahil)

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 

Birçok RDBMS'lerinde gerçekleştirmek küçük harf duyarsız varsayılan olarak aranıyor. Bu veritabanları için, yukarıdaki çözüm işe yarayacaktır. diğer ürünler için harf duyarlılığı sorunu çözmek için, RDBMS'niz özgü büyük dönüşüm işlevinde kullanıcı adının ilk geçtiği hariç tüm sarın: MySQL

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 için ise UPPER gerekli değildir ve sorguyu gereksiz şekilde yavaşlatabilir. –

+0

Evet, bu doğru (ve diğer çeşitli RDBMS'ler için de geçerlidir). Bunu yansıtmak için cevabı değiştireceğim. Güncelleme için –

+0

OK +1. –

0

SELECT'inizde ToLower() veya eşdeğer bir işlevi kullanın ve bu sütuna göre sıralayın.

+0

Çok girişli sorundan muzdarip olmayan kullanıcı adlarını içerecektir. –

0

, dava duyarlı bir ikili harmanlama kullanılarak yapılır karşılaştırın. Yani duyarlı karşılaştırma harf duyarsız durumdan farklıdır satırlar arayan kendi üzerine tabloyu katılabileceğini karşılaştırmak:

select * 
from YourTable t1 
inner join YourTable t2 
on t1.name <> t2.name collate latin1_bin 
and t1.name = t2.name 
1

bu

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, Ben Larry aynı şeyi ilk yayınladı görüyorum –

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

** Yorumdan queue **: Kaynak kodunuzun etrafına biraz bağlam eklemenizi rica edebilir miyim. Sadece kod cevapları anlamak zor. Gönderinize daha fazla bilgi ekleyebilmeniz durumunda, okuyucunun ve gelecekteki okuyucuların yardımcı olacaktır. – RBT