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

Откуда: Минск
Сообщений: 812
В общем имеется таблица (точнее вьюшка) с такими данными:
'1',
'2',
'3',
'3.1',
'3.2',
'3.3'
'4',
'10',
'11',
'12.1'
'12.2'
'13',
'19',
'20'
Это номер раздела, после точки - номер подраздела, далььше может быть еще одно вложение (ограничений на глубину нет)
Именно в таком порядке и надо отсортировать.
Просто так order by не применишь, после первой точки он сортирует, но вот до точки есть проблемы - '19','2','20'. Кроме того после точки при ко-ве подразделов больше 10 тоже будут проблемы.
Есть ли решение для данной проблемы?
8 ноя 11, 20:57    [11566264]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с сортировкой - номера подразделов в виде строки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
сделать чтобы между точками всегда было допустим 4 символа
например
'0003'
'0003.0001'
'0003.0002'
'0003.0003'
'0004'
'0010'
'0011'
'0012.0001'
'0012.0002'
'0013'


1) разложить на части (например посредством xml)
2) добить нулями (какой-то аналог lpad)
3) слить части обратно
8 ноя 11, 22:19    [11566449]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с сортировкой - номера подразделов в виде строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
WITH T(ID,S) AS
(
           SELECT 1,'1'
 UNION ALL SELECT 2,'2'
 UNION ALL SELECT 3,'3'
 UNION ALL SELECT 4,'3.1'
 UNION ALL SELECT 5,'3.2'
 UNION ALL SELECT 6,'3.3'
 UNION ALL SELECT 7,'4'
 UNION ALL SELECT 8,'10'
 UNION ALL SELECT 9,'11'
 UNION ALL SELECT 10,'12.1'
 UNION ALL SELECT 11,'12.2'
 UNION ALL SELECT 12,'13'
 UNION ALL SELECT 13,'19'
 UNION ALL SELECT 14,'20'
)
SELECT *
FROM T
ORDER BY
(
 SELECT STR(S,10)
 FROM
 (
  SELECT V.number,SUBSTRING(T.S,V.number,
   (
    SELECT MIN(VV.number)
    FROM master.dbo.spt_values VV
    WHERE VV.type='P' AND VV.number BETWEEN V.number AND LEN(T.S)+1
    AND CHARINDEX(SUBSTRING(T.S+'.',VV.number,1),'.')>0
   )-V.number
  )
  FROM master.dbo.spt_values V
  WHERE V.type='P' AND V.number BETWEEN 1 AND LEN(T.S)+1
  AND CHARINDEX(SUBSTRING('.'+T.S,V.number,1),'.')>0
 )T(N,S)
 WHERE S>''
 ORDER BY N
 FOR XML PATH('')
);
8 ноя 11, 22:22    [11566453]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с сортировкой - номера подразделов в виде строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Если у чисел между точками возможны лидирующие нули, то вместо STR(S,10) -> REPLACE(STR(S,10),' ','0')
8 ноя 11, 22:26    [11566458]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с сортировкой - номера подразделов в виде строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
declare @t table (s varchar(100));

insert into @t
values
 ('1'),
 ('2'),
 ('3'),
 ('3.1'),
 ('3.2'),
 ('3.3'),
 ('4'),
 ('10'),
 ('11'),
 ('12.1'),
 ('12.2'),
 ('13'),
 ('19'),
 ('20')
 
select
 *
from
 @t
order by
 cast('/' + replace(s, '.', '/') + '/' as hierarchyid)
8 ноя 11, 23:06    [11566558]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с сортировкой - номера подразделов в виде строки  [new]
Алексей Вк.
Member

Откуда: Минск
Сообщений: 812
iap,
Благодарю.
Интересный вариант, никогда
этим не пользовался
10 ноя 11, 18:54    [11577834]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с сортировкой - номера подразделов в виде строки  [new]
Алексей Вк.
Member

Откуда: Минск
Сообщений: 812
Паганель,
Да - я уже думал про этот вариант, но хотелось использовать встроенные средства, которые я еще далеко не все знаю.
10 ноя 11, 18:55    [11577838]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с сортировкой - номера подразделов в виде строки  [new]
Алексей Вк.
Member

Откуда: Минск
Сообщений: 812
invm,
Благодарю!
Красивый вариант, никогда этим типом не пользовался, надо будет подумать о других вараинтах его использования.
10 ноя 11, 18:56    [11577845]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с сортировкой - номера подразделов в виде строки  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Алексей Вк.
invm,
Благодарю!
Красивый вариант, никогда этим типом не пользовался, надо будет подумать о других вараинтах его использования.
Mnior'а благодарите, это его идея -- 10696898
10 ноя 11, 21:35    [11578219]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить