2010-07-01 2 views
7

У меня есть столбец, который обычно является числом (иногда это буквы, но это не важно).Естественная сортировка для SQL Server?

Как я могу сделать его естественным?

В настоящее время сортирует следующим образом: {} 1,10,11,12,2,3,4,5,6,7,8,9

Я хочу, чтобы сортировать следующим образом: {1,2 , 3,4,5,6,7,8,9,10,11,12}

ответ

6

IsNumeric «сломан», ISNUMERIC (CHAR (13)) возвращает 1 и CAST не удастся.

Использовать ISNUMERIC (textval + 'e0'). Окончательный код:

ORDER BY 
    PropertyName, 
    CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN 0 ELSE 1 END, -- letters after numbers 
    CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN CAST(MixedField AS INT) ELSE 0 END, 
    MixedField 

Вы можете смешать параметры порядка ...

+0

Практически там, который не сортирует нечисловое число просто добавляет их волей-неволей до конца. Я изменю ваш запрос и приму его – Malfist

-3

вы связаны с использованием:

'OrderBy ColumnName Asc'

в конце запроса.

+8

Это не естественный рода, это ASCII-сортировка. – Malfist

1

Включите его. Кроме того, не забудьте использовать IsNumeric, чтобы убедиться, что вы только вернете номера (если они включают буквы, это важно;).

SELECT textval FROM tablename 
WHERE IsNumeric(textval) = 1 
ORDER BY CAST(textval as int) 

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

Если вам нужны номера без номера в результирующем наборе, просто добавьте запрос UNION, где IsNumeric = 0 (заказ по любому желаемому) до или после.

+0

Проблема с объединением в том, что этот вид не относится к первому уровню. Первая сортировка - по имени свойства, и этот вид - по номеру элемента (обычно числовому, но может быть A, B, C, ...). Объединение будет много отбрасывать – Malfist

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