Форум: "Базы";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
ВнизПроблема с сортировкой текстовых полей Найти похожие ветки
← →
Stanislav © (2006-09-21 12:02) [0]Наверное я не один сталкиваюсь со следующей проблемой.
Нужно отсортировать текстовое поле, в которое записаны цифры в таком виде:
1
1.1
1.1.1
1.2
2
3
...
10
11
← →
Ega23 © (2006-09-21 12:10) [1]Я обычно рядышком ещё одно поле завожу типа int - порядок сортировки. И сортирую уже по нему.
← →
zdm © (2006-09-21 12:24) [2]да есть такая трабла, и ega23 прав-это типа классическое дерево, но, есть и альтернативный вариант, к сожалению я не могу тебе привести функцию, я сейчас её сам пишу(а она была, написана другим программером а кода конечно нет). Вообщем логика такая, (и кстати лучше не 1,1.1 а 1., 1.1.) ну и вообщем, ф-ция считает кол-во точек, а они соответственно и являются вложениями, а дальше была ВЬЮХА которая, разбивала, от определенного кол-ва точек, ну типа от m-точек до n-точек, и во ВЬЮХЕ запрос,
select ..... order by items1, items2 и т.д. т.е. items1, items2 это преобразованные значения(1., 1.1., 1.1.2. и т.д.) но уже без точек, т.е. как int, может чего упустил в своём рассказе, но на самом деле все не так сложно, и доп.полей не нужно
← →
sniknik © (2006-09-21 12:44) [3]> но на самом деле все не так сложно, и доп.полей не нужно
только тормоза
с сортировкой по специальному числовому полю это самый быстрый вариант.
частично (с первой определяемой цифрой), т.е. для показаного в примере пойдет
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:46) [4]чудес конечно не бывает и за все приходится расплачиваться, тебе самому выбирать, что важнее скорость или объем БД
← →
Stanislav © (2006-09-21 12:55) [5]Спасибо за варианты, буду пробовать, если естье еще решения пишите, потом напишу что выбрал.
← →
zdm © (2006-09-21 13:00) [6]
> sniknik © (21.09.06 12:44) [3]
И ещё не забывайте, что не всегда есть возможность реструктуировать БД!
← →
stone © (2006-09-21 13:04) [7]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
← →
Stanislav © (2006-09-21 14:02) [8]Сделал функцию на основе 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
← →
Stanislav © (2006-09-21 14:06) [9]Извеняюсь
Вызывать так:
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
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.041 c