Нечувствительные к регистру дубликаты SQL

Таким образом, у меня есть пользовательская таблица, где user.username имеет много дубликатов как:

username и Username и useRnAme
john и John и jOhn

Это было ошибкой, и эти три записи должны были быть только одним.

Я пытаюсь придумать SQL-запрос, который перечисляет все эти случаи, заказанные их датой создания, таким образом, идеально результат должен быть чем-то вроде этого:

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

Любые предложения будут очень цениться

12
задан Peter Lang 22 April 2010 в 20:11
поделиться

4 ответа

Оставив на мгновение в стороне вопрос чувствительности к регистру, основная стратегия такова:

 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

Многие СУБД (включая MySQL при условии, что вы используете CHAR или VARCHAR для столбца имени пользователя) по умолчанию выполнять поиск без учета регистра. Для этих баз данных будет работать вышеуказанное решение. Чтобы решить проблему чувствительности к регистру для других продуктов, заключите все, кроме первого вхождения имени пользователя в функцию преобразования верхнего регистра, специфичную для вашей СУБД:

 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
27
ответ дан 2 December 2019 в 05:27
поделиться

Используйте ToLower () или аналогичную функцию в ваш SELECT и упорядочить по этому столбцу.

0
ответ дан 2 December 2019 в 05:27
поделиться

В MySQL сравнение с учетом регистра выполняется с использованием двоичной сортировки. Таким образом, вы можете присоединиться к таблице в поисках строк, в которых сравнение с учетом регистра отличается от сравнения без учета регистра:

select *
from YourTable t1
inner join YourTable t2 
on t1.name <> t2.name collate latin1_bin
and t1.name = t2.name
0
ответ дан 2 December 2019 в 05:27
поделиться

Попробуйте что-нибудь вроде этого

SELECT UserName, CreatedDate
FROM User
WHERE LOWER(TRIM(UserName)) IN 
(
SELECT LOWER(TRIM(UserName))
FROM User
GROUP BY LOWER(TRIM(UserName))
HAVING count(*) > 1
)
1
ответ дан 2 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: