SQLite с использованием GROUP BY без учета регистра

#sql #string #sqlite #group-by

#sql #строка #sqlite #группировка по

Вопрос:

В моей таблице есть столбец для адресов электронной почты, где адреса могут быть в нижнем регистре, в верхнем регистре, в формате camelcase и т. Д. Как я могу изменить свой запрос так, чтобы адреса, подобные example@gmail.com и ПРИМЕР @GMAIL.COM будут сгруппированы вместе.

Это мой фактический запрос:

 SELECT count(Email) as Number, Email
FROM tbl_SAP_Users
GROUP BY Email
HAVING Number > 1
ORDER BY Number DESC;
  

Ответ №1:

Вы можете group by lower(Email) :

 SELECT count(*) as Number, lower(Email) Email
FROM tbl_SAP_Users
GROUP BY lower(Email)
HAVING Number > 1
ORDER BY Number DESC;
  

Или использовать COLLATE NOCASE в GROUP BY предложении:

 SELECT count(*) as Number, Email
FROM tbl_SAP_Users
GROUP BY Email COLLATE NOCASE
HAVING Number > 1
ORDER BY Number DESC;
  

Комментарии:

1. Это определенно удовлетворяет мои потребности, но Том Смоллвуд также решил проблему, о которой я не подозревал. Тем не менее, спасибо.

2. @SebastianS Могут быть другие проблемы, которые вы не описали в своем вопросе. Вы же не ожидаете, что мы догадаемся, не так ли?

3. Я этого не делаю. Если я найду еще какие-то проблемы, я обновлю вопрос. Или лучше, я ищу, как манипулировать данными, например, с помощью lower() и trim().

4. @SebastianS Если вы этого не сделаете, вам следует принять ответ, который решил проблему, которую вы описали в своем вопросе, потому что, если в ваших электронных письмах есть начальные или конечные пробелы, тогда предложение GROUP BY будет группироваться 'a' и 'a ' в разных группах, но это не то, что вы просили.

Ответ №2:

Вы можете попробовать функцию LOWER(), чтобы сделать их все строчными.

Вы также можете использовать TRIM() для устранения пробелов на обоих концах.

 SELECT count(Email) as Number, Email
FROM tbl_SAP_Users
GROUP BY LOWER(TRIM(Email))
HAVING Number > 1
ORDER BY Number DESC;