Как я могу ЗАКАЗАТЬ все, что выглядит как число, как число в T-SQL? - PullRequest
0 голосов
/ 06 февраля 2012

У меня есть столбец с именем Code, который является varchar (3).

Он также содержит числа и строки.Например: ' 1', '234', 'Xxx', '9 ','Aa ' и т. Д.

Есть ли способ - точно так же, как в MS EXCEL - ЗАКАЗАТЬ что-нибудь, что выглядит как число, как число?

Таким образом, результат для приведенного выше примера будет:

1. 1 
2. 234 
3. 9 
4. Aa 
5. Xxx

Ответы [ 2 ]

4 голосов
/ 06 февраля 2012
ORDER BY CASE WHEN ISNUMERIC(YourField) = 1 THEN CONVERT(INT, YourField) - 500 ELSE ASCII(LOWER(YourField)) END

Если поле можно преобразовать в число, оно сортируется по номеру, в противном случае для сортировки используется кодировка ASCII. Я использовал «- 500» только для того, чтобы в сортировке не было перехода, и чтобы номера были отсортированы перед текстом.


ДОПОЛНЕНИЕ:

Брайан Арсуага опубликовал более надежное решение для этого, которое я на самом деле предпочитаю, но так как это уже помечено как ответ, я добавляю его решение к этому для блага любого, кто читает это в будущее.

ORDER BY 
        ISNUMERIC(YourField) DESC, 
        CASE WHEN ISNUMERIC(YourField) = 1 THEN CONVERT(INT, YourField) ELSE 0 END,
        YourField
2 голосов
/ 07 февраля 2012

Если вам не нравится использовать произвольный страж (500), что может вызвать проблемы с сортировкой в ​​зависимости от ожидаемого диапазона чисел, вы можете использовать несколько выражений для упорядочения.

-- put the numbers at the top
ORDER BY ISNUMERIC(YourField) DESC,
       -- sort the numbers as numbers, sort the strings as nothing
       CONVERT(INT, CASE WHEN ISNUMERIC(YourField) = 1 THEN YourField ELSE '0' END),
       -- sort the strings
       YourField

последний термин - это только тай-брейк, если оба термина являются числами с одинаковым значением ('01', '1') или два термина не являются числами.Для не чисел их первое и второе слагаемые всегда будут 0.

Более сложный, но, возможно, немного более безопасный.

Отредактировано, чтобы добавить хорошее сравнение с помощью парня ниже

create table #t
(
    YourField varchar(4)
)
insert into #t(YourField) Values('1'), ('3'), ('234'), ('0'), ('00'),
   ('09'), ('9'), ('1a'), ('aaa'), ('aba'), ('-500')

Select YourField from #t

  ORDER BY ISNUMERIC(YourField) DESC,
           CONVERT(INT, CASE WHEN ISNUMERIC(YourField) = 1 THEN YourField ELSE '0' END),
           YourField

drop table #t

example results

...