SQL: сортировка по имени домена электронной почты - PullRequest
18 голосов
/ 28 ноября 2009

Какой самый короткий и / или эффективный оператор SQL для сортировки таблицы со столбцом адреса электронной почты по фрагменту имени DOMAIN?

Это, по сути, игнорирование того, что стоит перед "@" в адресах электронной почты и без учета регистра. Давайте проигнорируем интернационализированные доменные имена для этого.

Цель: mySQL, MSSQL, Oracle

Пример данных от TABLE1

id   name           email 
------------------------------------------
 1   John Doe       johndoe@domain.com
 2   Jane Doe       janedoe@helloworld.com
 3   Ali Baba       ali@babaland.com
 4   Foo Bar        foo@worldof.bar.net
 5   Tarrack Ocama  me@am-no-president.org

Заказ по электронной почте
SELECT * FROM TABLE1 ORDER BY EMAIL ASC

id   name           email 
------------------------------------------
 3   Ali Baba       ali@babaland.com
 4   Foo Bar        foo@worldof.bar.net
 2   Jane Doe       janedoe@helloworld.com
 1   John Doe       johndoe@domain.com
 5   Tarrack Ocama  me@am-no-president.org

Заказ по домену
SELECT * FROM TABLE1 ORDER BY ?????? ASC

id   name           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

EDIT:
Я не прошу ни одного оператора SQL, который будет работать на всех трех или более механизмах SQL. Любой вклад приветствуется. :)

Ответы [ 13 ]

1 голос
/ 28 ноября 2009

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

SQL Server, вправо () и patindex ()

Oracle, instr () и substr ()

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

1 голос
/ 28 ноября 2009

Вам понадобится использовать функции обработки текста для анализа домена. Тогда заказ по новому столбцу.

0 голосов
/ 11 октября 2010

работай умнее, а не усерднее:

SELECT REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING(emails.email, POSITION('@' IN emails.email)+1)),'.',2)) FROM emails
...