Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Эх! Сортировочка! Или как задать правила сортировки? [D7, MSSQL]


31512 ©   (2004-04-20 07:52:00) 

В MS SQL Server 2000 правила сортировки задаются еще когда мы устанавливаем его. Потом их, наверное, можно изменить. У меня назрела необходимость сортировать некоторый тип данных, ну точь в точь как IP адрес (короче, разве что и точка в конце):
     1.2.3.
     1.14.
     34.54.32
Смысл их - регистрационный номер. На данных момент этот тип данных - строка. И сортируется он как строка.
Например, после сортировки имеем:
... 1.8. 1.9. 2.1. 2.10. 2.11. 2.12. ... 2.2. 2.20. ... 2.3. ...
И это правильно, но надо:
... 1.8. 1.9. 2.1. 2.2. 2.3. ... 2.10. 2.11. 2.12. ... 2.20. ...
Как заставить сервер сортировать именно так? И какой домен лучше создать для таких регистрационных номеров?


31512   (2004-04-20 11:51:00) [1]

Всем, всем всем большое спасибо!


sniknik   (2004-04-20 11:14:00) [2]

> Для sniknik ©
> не работает....
для 31512 ©   (20.04.04 09:06) [3]
переведи на MSSQL


Danilka   (2004-04-20 10:07:00) [3]

Можно сделать что угодно, но сортировать очень желательно по индексу, иначе потом могут юзеры членовредительство совершить. Или начальник с работы уволить. :)

Хотя, конечно, если в таблице 10 записей, то почему-бы и не поизвращаться?


wild_arg   (2004-04-20 10:02:00) [4]

а может функцию написать
CREATE FUNCTION dbo.fExtractWord (@aStr varchar(1000), @aInd int)  
RETURNS varchar(200) AS  
BEGIN
declare @res varchar(200),
 @ind int,
 @i int
set @res = @aStr
set @ind = @aInd
while (@ind<>1) begin
 set @i = charindex('.',@res)
 if @i = 0 set @i = len(@res)-1
 set @res = substring(@res,@i+1,len(@res)-@i)
 set @ind = @ind-1
end
set @i = charindex('.',@res)
if @i<>0 set @res = substring(@res,1,@i-1)

Return @res
END


а потом в условиях сортировки писать так:
...
order by
        cast(dbo.fExtractWord(YourField,1) as int),
        cast(dbo.fExtractWord(YourField,2) as int),
        cast(dbo.fExtractWord(YourField,3) as int),
        cast(dbo.fExtractWord(YourField,4) as int),
        cast(dbo.fExtractWord(YourField,5) as int)
        .....


Danilka   (2004-04-20 09:56:00) [5]

Все-таки, проще и правильней сделать вот-так: [6] Наталия ©   (20.04.04 09:19)

иначе при сортировке не будут использоваться индексы. а при таком варианте будут, разумеется, если это доп.поле будет проиндексировано.


Наталия   (2004-04-20 09:36:00) [6]

31512 ©   (20.04.04 09:24) [8]
Ключевое слово еще одно


31512   (2004-04-20 09:32:00) [7]

А может сделать поле, как предлагает Наталия, типа int, назовём его SORT_ORDER, и будем по нему сортировать, только придётся делать анализ каждого вводимого значения регистрационного номера... И даже примерно ясно как его делать...


31512   (2004-04-20 09:28:00) [8]

Для asp ©
А это интересно... Вот только длина каждого параметра может быть разной, например 1.1092.34. Надо подумать.


asp   (2004-04-20 09:24:00) [9]

Можешь попробовать написать UDF, например, EXTRACT_IP_NUM(VARCHAR(16), INTEGER). Которая будет извлекать число из строки (первый параметр), под номером из второго параметра. И затем сортировать по извлеченным числам.


31512   (2004-04-20 09:24:00) [10]

<Для Наталия ©
Ага, а потом заниматься любовью с тем, чтобы пользователю представить это обратно в исходном виде... Нет уж. :)


Наталия   (2004-04-20 09:19:00) [11]

Если это всё-таки не IP-адрес, то можно сделать еще одно поле, заполняемое триггером, где хранить в преобразованном для правильной сортировки виде, например 001.002.003


31512   (2004-04-20 09:18:00) [12]

Для ЮЮ ©
Я понимаю. Я просто хотел сказать, что запись похожа на формат IP адреса. В обычном целом хранить это не получается.


ЮЮ   (2004-04-20 09:09:00) [13]

>ну точь в точь как IP адрес

IP-адрес имеет длину 4 байта и обычно записываетсяв виде четырех чисел, представляющих значения каждого байта в десятичной форме, и разделенных точками, например:

128.10.2.30 - традиционная десятичная форма представления адреса,

10000000 00001010 00000010 00011110 - двоичная форма представления этого же адреса.

З.Ы. хранить в обычном целом


31512   (2004-04-20 09:06:00) [14]

Для sniknik ©

не работает....


31512   (2004-04-20 08:48:00) [15]

Для sniknik ©
Предлагаешь
order by CInt(Left(xxx,1)), CInt(Mid(xxx,3,3))?


sniknik   (2004-04-20 08:02:00) [16]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1082016968&n=1
переведи на MSSQL


Наверх

Титульная страница Поиск, карта сайта Написать письмо