Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизЭх! Сортировочка! Или как задать правила сортировки? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c