Как применить нестандартный порядок сортировки столбцов SQL? - PullRequest
3 голосов
/ 26 ноября 2011

Рассмотрим следующую таблицу с именем Persons:

Key Name    Type    Date        Pack
1   Pocoyo  KIND    30-11-2011  1
2   Erik    MAN     10-10-1980  1
3   Alinda  VROUW   12-12-1991  1
4   Pingu   KIND    11-12-2012  1
5   Elisia  KIND    11-11-2010  1
6   Kees    MAN     10-11-1984  2

Теперь я хотел бы отсортировать эту таблицу по Pack, Type и Date, но я бы хотел Typeсортироваться как MAN, VROUW, KIND, поэтому в основном желаемый результат должен быть таким:

Key Name    Type    Date        Pack
2   Erik    MAN     10-10-1980  1
3   Alinda  VROUW   12-12-1991  1
5   Elisia  KIND    11-11-2010  1
1   Pocoyo  KIND    30-11-2011  1
4   Pingu   KIND    11-12-2012  1
6   Kees    MAN     10-11-1984  2

Как я могу создать этот запрос?

Ответы [ 3 ]

8 голосов
/ 26 ноября 2011

Попробуйте

SELECT * 
FROM Persons
ORDER BY
    Pack,
    CASE Type
        WHEN 'MAN' THEN 1
        WHEN 'VROUW' THEN 2
        WHEN 'KIND' THEN 3
    END,
    Date ASC

MSDN: CASE (Transact-SQL)

CASE может использоваться в любом утверждении или предложении, которое позволяет выражение. Например, вы можете использовать CASE в таких выражениях, как SELECT, UPDATE, DELETE и SET, а также в таких предложениях, как select_list, IN, WHERE, ЗАКАЗАТЬ НА И ИМЕЕТ.

3 голосов
/ 26 ноября 2011

Я был бы склонен создать новую таблицу справочных данных, скажем PersonType для хранения ожидаемых значений столбца «Тип» и их относительного приоритета сортировки:

Type   SortPriority
MAN    1
VROUW  2
KIND   3

И выполните левое внешнее объединение для этой таблицы, чтобы определить порядок сортировки результатов запроса к Persons:

SELECT
    *
FROM
    Persons p
LEFT OUTER JOIN PersonType pt on p.Type = pt.Type
ORDER BY
    Pack, 
    SortPriority, 
    Date
2 голосов
/ 26 ноября 2011

Полагаю, из-за ваших комментариев ваш нестандартный заказ связан с порядком элементов в перечислении.Если это так, рассмотрите возможность сохранения значения, а не имени перечисления в базе данных.Позвольте вашему DAL преобразовать перечисление при чтении / записи в БД.Например, сегодня в EntityFramework мы можем написать небольшой класс-обертку, который становится типом столбца enum, и определить эквивалентность и неявные преобразования между оберткой и enum.См. этот ответ для получения дополнительной информации о перечислениях и EF.В Июнь 2011 CTP EF добавляет поддержку этого перевода напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...