Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.46 MB
Время: 0.043 c
15-1162468189
Карелин Артем
2006-11-02 14:49
2006.11.19
Тайный смысл фразы "How are you"...


2-1162374872
Iuda_iz_Kf
2006-11-01 12:54
2006.11.19
DialUp


15-1161803262
vidiv
2006-10-25 23:07
2006.11.19
Про то же переименовывание...


1-1159998160
Doma
2006-10-05 01:42
2006.11.19
Как получить PTypeData на тип по названию?


11-1121340015
Barloggg
2005-07-14 15:20
2006.11.19
Хочу избавиться от MCK





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский