Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Эх! Сортировочка! Или как задать правила сортировки?   Найти похожие ветки 

 
31512 ©   (2004-04-20 07:52) [0]

В 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. ...
Как заставить сервер сортировать именно так? И какой домен лучше создать для таких регистрационных номеров?


 
sniknik ©   (2004-04-20 08:02) [1]

http://delphimaster.net/view/3-1082016968/
переведи на MSSQL


 
31512 ©   (2004-04-20 08:48) [2]

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


 
31512 ©   (2004-04-20 09:06) [3]

Для sniknik ©

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


 
ЮЮ ©   (2004-04-20 09:09) [4]

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

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

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

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

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


 
31512 ©   (2004-04-20 09:18) [5]

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


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

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


 
asp ©   (2004-04-20 09:24) [7]

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


 
31512 ©   (2004-04-20 09:24) [8]

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


 
31512 ©   (2004-04-20 09:28) [9]

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


 
31512 ©   (2004-04-20 09:32) [10]

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


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

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


 
Danilka ©   (2004-04-20 09:56) [12]

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

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


 
wild_arg ©   (2004-04-20 10:02) [13]

а может функцию написать
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 10:07) [14]

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

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


 
sniknik ©   (2004-04-20 11:14) [15]

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


 
31512 ©   (2004-04-20 11:51) [16]

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



Страницы: 1 вся ветка

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
3-1082614692
jenya_d
2004-04-22 10:18
2004.05.16
Средства разработчика БД MS SQL 2000


7-1081108556
CAHEK
2004-04-04 23:55
2004.05.16
Flash в Делфийной проги без FlashPlayer a


3-1082688315
ksa3003
2004-04-23 06:45
2004.05.16
Время сервера


3-1082570720
alle
2004-04-21 22:05
2004.05.16
Проблема в DataModule


1-1083440703
APXi
2004-05-01 23:45
2004.05.16
Как передать строку другой копии моего приложения.