SQL: сортировка по электронной почте доменного имени

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

19
задан Old Pro 24 January 2019 в 06:52
поделиться

9 ответов

Попробуйте это

Запрос (для Sql Server):

select * from mytbl
order by SUBSTRING(email,(CHARINDEX('@',email)+1),1)

Запрос (для Oracle):

select * from mytbl
order by substr(email,INSTR(email,'@',1) + 1,1)

Запрос (для MySQL)

pygorex1 already answered

Вывод:

id имя email

5   Tarrack Ocama   me@am-no-president.org
3   Ali Baba    ali@babaland.com
1   John Doe    johndoe@domain.com
2   Jane Doe    janedoe@helloworld.com
4   Foo Bar foo@worldof.bar.net
21
ответ дан 30 November 2019 в 02:16
поделиться

Это будет работать с Oracle:

select id,name,email,substr(email,instr(email,'@',1)+1) as domain
from table1
order by domain asc
1
ответ дан 30 November 2019 в 02:16
поделиться

MySQL, интеллектуальная комбинация right () и instr ()

SQL Server, right () и patindex ()

Oracle, instr () и substr ()

И, как сказал кто-то другой, если у вас от приличного до высокого количества записей, оберните поле электронной почты в функциях в вашем предложении where сделает так, что СУБД не сможет использовать какой-либо индекс, который может быть у вас в этом столбце. Итак, вы можете рассмотреть возможность создания вычисляемого столбца, содержащего домен.

1
ответ дан 30 November 2019 в 02:16
поделиться

Если у вас миллион записей, я предлагаю вам создать новый столбец только с доменным именем.

1
ответ дан 30 November 2019 в 02:16
поделиться

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

select id,name,email from table order by name

select id,name,email,account,domain from table order by email

select id,name,email,account,domain from table order by domain,account

как указывает Донни, функции обработки строк нестандартны .. вот почему вам придется сохранить избыточность данных!

Я добавил учетную запись и домен в третий запрос, поскольку мне кажется, что не все СУБД будут сортировать запрос по полю, которого нет в выбранных полях.

2
ответ дан 30 November 2019 в 02:16
поделиться

Для SQL Server вы можете добавить вычисляемый столбец в свою таблицу с извлечениями домена в отдельное поле. Если вы сохраните этот столбец в таблице, вы можете использовать его как любое другое поле и даже добавить к нему индекс, чтобы ускорить процесс, если вы часто запрашиваете по имени домена:

ALTER TABLE Table1
  ADD DomainName AS 
     SUBSTRING(email, CHARINDEX('@', email)+1, 500) PERSISTED

Итак, теперь ваша таблица будет иметь дополнительный столбец «DomainName», который содержит все, что находится после знака «@» в вашем адресе электронной почты.

4
ответ дан 30 November 2019 в 02:16
поделиться

Если вы хотите, чтобы это решение вообще масштабировалось, вы должны , а не пытаться извлекать подстолбцы. Построчные функции, как известно, работают медленно, поскольку таблица становится все больше и больше.

В этом случае правильное , что нужно сделать, это переместить стоимость извлечения из select (где это бывает много) до вставки / обновления , где это происходит реже (в большинстве обычных баз данных). Затраты только на , вставку и обновление значительно повышают общую эффективность базы данных, поскольку это только момент времени, когда вам нужно сделать это (т.е. это единственный раз, когда данные меняются).

Для этого разделите адрес электронной почты на два отдельных столбца в таблице, email_user и email_domain ). Затем вы можете либо разделить его в своем приложении перед вставкой / обновлением, либо использовать триггер (или предварительно вычисленные столбцы, если ваша СУБД поддерживает его) в базе данных, чтобы сделать это автоматически.

Затем вы сортируете по email_domain и, если вам нужен полный адрес электронной почты, используйте email_name | '@' | email_domain .

В качестве альтернативы вы можете оставить полный столбец email и использовать триггер для дублируйте только часть домена в email_domain , тогда вам не придется беспокоиться об объединении столбцов для получения полного адреса электронной почты.

Вполне приемлемо вернуться из 3NF по соображениям производительности, если вы знаете, что вы повторять. В этом случае данные в двух столбцах могут ' t рассинхронизация просто потому, что триггеры не позволяют этого. Это хороший способ обменять дисковое пространство (относительно дешевый) на производительность (мы всегда хотим большего).

И, если вы из тех, кто вообще не любит возвращаться с 3NF , решение email_name / email_domain исправит это.

Это также предполагает, что вы просто хотите обрабатывать адреса электронной почты в форме a @ b - есть и другие действующие адреса электронной почты, но я не припомню, чтобы я видел их в течение многих лет.

8
ответ дан 30 November 2019 в 02:16
поделиться

Для MySQL:

select email, SUBSTRING_INDEX(email,'@',-1) AS domain from user order by domain desc;

Для нечувствительности к регистру:

select user_id, username, email, LOWER(SUBSTRING_INDEX(email,'@',-1)) AS domain from user order by domain desc;
16
ответ дан 30 November 2019 в 02:16
поделиться

Вам нужно будет использовать функции обработки текста, чтобы разобрать домен. Затем сделайте заказ по новой колонке.

1
ответ дан 30 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

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