![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с сортировкой текстовых полей [D7, MSSQL]
Stanislav © (2006-09-21 12:02:00)Наверное я не один сталкиваюсь со следующей проблемой.
Нужно отсортировать текстовое поле, в которое записаны цифры в таком виде:
1
1.1
1.1.1
1.2
2
3
...
10
11
Stanislav (2006-09-21 14:06:00) [1]Извеняюсь
Вызывать так:
Select *,DBO.SORTSTR(POLE,1) AS S1,DBO.SORTSTR(POLE, 2) AS S2,DBO.SORTSTR(POLE, 3) AS S3 from
(select '1' as POLE
UNION
select '2' as POLE
UNION
select '1.1' as POLE
UNION
select '1.2.1' as POLE
UNION
select '1.10.2' as POLE
UNION
select '3' as POLE
UNION
select '4' as POLE
UNION
select '10' as POLE
UNION
select '11' as POLE) as Q
ORDER BY S1,S2,S3
Stanislav (2006-09-21 14:02:00) [2]Сделал функцию на основе sniknik © (21.09.06 12:44) [3]
смотрите, может кто подскажет, как оптимизировать
CREATE FUNCTION SORTSTR (@NUMBERSTR NVARCHAR(50),@LEVEL INT)
RETURNS INT AS
BEGIN
DECLARE @A INT,@L INT, @R INT, @NS NVARCHAR(50)
SET @L=1
SET @NS=@NUMBERSTR
SET @A=1
WHILE @A>0 AND @L<=@LEVEL
BEGIN
SET @A=CHARINDEX('.', @NUMBERSTR)
SET @R=CAST(CASE WHEN @A > 0 THEN LEFT(@NS, @A-1) ELSE @NS END AS INT)
SET @NS=STUFF(@NS,1,@A,'')
SET @L=@L+1
END
RETURN @R
END
Вызывать так:
Select *,DBO.SORTSTR(POLE,1) AS S1,DBO.SORTSTR(POLE,1) AS S2,DBO.SORTSTR(POLE,1) AS S3 from
(select '1' as POLE
UNION
select '2' as POLE
UNION
select '1.1' as POLE
UNION
select '1.2.1' as POLE
UNION
select '1.10.2' as POLE
UNION
select '3' as POLE
UNION
select '4' as POLE
UNION
select '10' as POLE
UNION
select '11' as POLE) as Q
ORDER BY S1,S2,S3
stone (2006-09-21 13:04:00) [3]create table #t (Field varchar(10))
insert into #t
select '1'
union all
select '1.1'
union all
select '1.1.1'
union all
select '1.2'
union all
select '2'
union all
select '3'
union all
select '10'
union all
select '11'
select Field, cast(left(Field, case when CHARINDEX('.', Field) > 0 then CHARINDEX('.', Field) - 1 else len(field) end) as int) from #t order by 2,1
drop table #t
zdm (2006-09-21 13:00:00) [4]
> sniknik © (21.09.06 12:44) [3]
И ещё не забывайте, что не всегда есть возможность реструктуировать БД!
Stanislav (2006-09-21 12:55:00) [5]Спасибо за варианты, буду пробовать, если естье еще решения пишите, потом напишу что выбрал.
zdm (2006-09-21 12:46:00) [6]чудес конечно не бывает и за все приходится расплачиваться, тебе самому выбирать, что важнее скорость или объем БД
sniknik (2006-09-21 12:44:00) [7]> но на самом деле все не так сложно, и доп.полей не нужно
только тормоза
с сортировкой по специальному числовому полю это самый быстрый вариант.
частично (с первой определяемой цифрой), т.е. для показаного в примере пойдет
SELECT * FROM xxx
ORDER BY CAST(CASE WHEN CHARINDEX('.', xx) > 0 THEN LEFT(xx, CHARINDEX('.', xx)-1) ELSE xx END AS INT), xx
zdm (2006-09-21 12:24:00) [8]да есть такая трабла, и ega23 прав-это типа классическое дерево, но, есть и альтернативный вариант, к сожалению я не могу тебе привести функцию, я сейчас её сам пишу(а она была, написана другим программером а кода конечно нет). Вообщем логика такая, (и кстати лучше не 1,1.1 а 1., 1.1.) ну и вообщем, ф-ция считает кол-во точек, а они соответственно и являются вложениями, а дальше была ВЬЮХА которая, разбивала, от определенного кол-ва точек, ну типа от m-точек до n-точек, и во ВЬЮХЕ запрос,
select ..... order by items1, items2 и т.д. т.е. items1, items2 это преобразованные значения(1., 1.1., 1.1.2. и т.д.) но уже без точек, т.е. как int, может чего упустил в своём рассказе, но на самом деле все не так сложно, и доп.полей не нужно
Ega23 (2006-09-21 12:10:00) [9]Я обычно рядышком ещё одно поле завожу типа int - порядок сортировки. И сортирую уже по нему.