Естественная сортировка в SQL Server 2005 - PullRequest
1 голос
/ 17 декабря 2011

Я использую C # и SQL Server 2005. У меня есть набор данных с номерами таблиц, так что мне нужно иметь естественную сортировку по:

 1
 10
 2
 I.1
 Table 1
 Table 2
 Table 10
 I.10
 I.2

Выше мои номера, и я хочу, чтобы они сначала были отсортированы по номеру (1,2, ..., 10, 11), а затем по алфавиту (I.1, I.2, ..., 1.10, I.11 и т. Д.), В котором в конце ставятся таблица 1, таблица 2, ..., таблица 10, ...

Есть ли способ сделать это с помощью какого-нибудь прикольного SQL?

(Примечание: я не могу использовать функцию естественной сортировки C #, так как не могу загрузить весь набор данных одновременно).

Ответы [ 2 ]

0 голосов
/ 07 сентября 2012

Попробуйте это:

 
declare @a as table (name varchar(100))
insert into @a values ('1')
insert into @a values ('10')
insert into @a values ('2')
insert into @a values ('I.1')
insert into @a values ('Table 1')
insert into @a values ('Table 2')
insert into @a values ('Table 10')
insert into @a values ('I.10')
insert into @a values ('I.2')

select name from
(
select top 10 name 
from 
    (   select top 10 row_number() over (partition by numerics order by numerics desc) sono, numerics, name 
        from 
        (
            select isnumeric(name) numerics, name 
            from @a
        )t
    )s where numerics = 1 order by convert(decimal, name)
) a
union all
select name from
(
select top 10 name 
from 
    (
        select top 10 row_number() over (partition by numerics order by numerics desc) sono, numerics, name 
        from 
        (
            select isnumeric(name) numerics, name 
            from @a
        )u 
    ) v where numerics = 0 order by name
) b

0 голосов
/ 17 декабря 2011

Примерно так может работать (не проверено, поскольку у меня нет экземпляра SQL Server на ноутбуке, который я использую):

  SELECT *
    FROM [tbl]
ORDER BY ISNUMERIC([col]) DESC,
         CASE ISNUMERIC([col])
              WHEN 1 THEN CAST([col] AS INT)
              ELSE [col]
              END ASC;

Функция ISNUMERIC возвращает 1, если считает, что значение является допустимым числом, поэтому:

  • ISNUMERIC([col]) DESC ставит цифры впереди
  • CASE ... END сортирует числа по номерам, а текстовые значения по алфавиту.

Вам может понадобиться отрегулировать это, но это должно привести вас к правильному пути.

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