2015-04-21 3 views
0

Я пытаюсь сделать заказ с помощью нескольких столбцов. Первая колонка имеет несколько условий.SQL Server ORDER BY Несколько значений в случае оператора

Базовый порядок был что-то вроде

SELECT * 
FROM Table T 
ORDER BY T.A, T.B, T.C 

Большую часть времени столбца A является внутр. Иногда A - это int с буквой, прилагаемой в конце. Я хочу, чтобы заказ был моим номером. Я смог добиться этого, изменив запрос на следующее, которое работает уже несколько месяцев.

SELECT * 
FROM Table T 
ORDER BY 
CASE WHEN ISNUMERIC(a.[HUDLine]) = 0 THEN CAST(SUBSTRING(T.A,1, PATINDEX('%[^0-9]%',T.A - 1) AS INT) 
ELSE CAST (T.A AS INT) end 
, T.B, T.C 

Недавно новое требование придумал что позволяет значение «OFFLINE» существует в столбце A.

Я хочу изменить ORDER BY, чтобы сохранить ту же логику, как и раньше, за исключением всех записи с «OFFLINE» находятся в конце.

ответ

1

Во-первых, я очень сожалею о ваших требованиях, абсолютно бессмысленно, что смешанные значения хранятся в столбце varchar.

Второй попробовать этот

CASE WHEN a.[HUDLine] = 'OFFLINE' 
THEN 2147483647 --This is the maximum signed int value 
ELSE 
    (CASE WHEN ISNUMERIC(a.[HUDLine]) = 0 
    THEN CAST(SUBSTRING(T.A,1, PATINDEX('%[^0-9]%',T.A - 1) AS INT) 
    ELSE CAST (T.A AS INT) 
    END) 
END 

Показать, что тот, кто отвечает за вашу DataModel, и вежливо попросить их хранить meanigful числовые данные в числовом столбце.

Смежные вопросы