Естественная сортировка для SQL Server? - PullRequest
8 голосов
/ 01 июля 2010

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

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

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

Я хочу отсортировать так: {1,2,3,4,5,6,7,8,9,10,11,12}

Ответы [ 3 ]

8 голосов
/ 01 июля 2010

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

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

2 голосов
/ 01 июля 2010

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

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

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

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

0 голосов
/ 01 июля 2010

Вы связали, используя:

'OrderBy ColumnName Asc'

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

...