Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 сортировка  [new]
mos
Member

Откуда: Vilnius
Сообщений: 701
Как отсортировать varchar поле, в котором могут быть числа и буквы

1
2
2A
2B
3C
10
11A
11D
27 июн 11, 14:12    [10881068]     Ответить | Цитировать Сообщить модератору
 Re: сортировка  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
mos, разделите на две части, сортируйте по обеим. но первую надо будет перевести в число либо добить ведущими нулями
27 июн 11, 14:23    [10881195]     Ответить | Цитировать Сообщить модератору
 Re: сортировка  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
1
2
2A
2B
3C
10
11A
11D


а почему не так?

1
2
10
2A
2B
3C
11A
11D
27 июн 11, 14:46    [10881405]     Ответить | Цитировать Сообщить модератору
 Re: сортировка  [new]
stimpi
Member

Откуда: Киев, Украина
Сообщений: 662
declare @tbl table (val varchar(20))

insert into @tbl(val)
values('1'),('2A'),('3C'),('11'),('11D'),
('2'),('2B'), ('XY'), ('10'),('11A'), ('CD')

select val
from @tbl
order by 
case when PATINDEX('%[0-9]%', val) <> 0 then 0 else 1 end,
CAST(SUBSTRING(val, 0, CASE WHEN PATINDEX('%[^0-9]%', val) = 0 THEN LEN(val) + 1 ELSE PATINDEX('%[^0-9]%', val) END) AS INT),
SUBSTRING(val, CASE WHEN PATINDEX('%[^0-9]%', val) = 0 THEN LEN(val) ELSE PATINDEX('%[^0-9]%', val) END, LEN(val))
27 июн 11, 18:12    [10883029]     Ответить | Цитировать Сообщить модератору
 Re: сортировка  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
mos,
Еще вариант
select val from @tbl
order by case when patindex('%[0-9]%', val) <> 0 then 0 else 1 end, replace(str(left(val, patindex('%[^0-9]%', val+' ')-1)), ' ', '0'),
substring(val, patindex('%[^0-9]%',val+' '), 200000000)
27 июн 11, 19:06    [10883303]     Ответить | Цитировать Сообщить модератору
 Re: сортировка  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
mos,
даже попроще можно:

declare @tbl table (val varchar(20))
insert into @tbl(val) values('1'),('2A'),('3C'),('11'),('11D'), ('0'), ('2'),('2B'), ('XY'), ('10'),('11A'), ('CD')

select val
from @tbl
order by case when patindex('%[0-9]%', val) <> 0 then 0 else 1 end, cast(left(val, patindex('%[^0-9]%', val+' ')-1) as int),
substring(val, patindex('%[^0-9]%',val+' '), 2000000000)
28 июн 11, 09:56    [10884882]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить