![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Эх! Сортировочка! Или как задать правила сортировки? [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