Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.49 MB
Время: 0.043 c
1-1083193645
Star-ko
2004-04-29 03:07
2004.05.16
Редактор с подсветкой.


6-1080241768
3APA3A
2004-03-25 22:09
2004.05.16
На отправляющий сокет приходит инфа, хотя приходить не должна...


3-1082614389
Andriy Tysh
2004-04-22 10:13
2004.05.16
ClientDataSet &amp; AggregatesFields


7-1081509708
Zheks
2004-04-09 15:21
2004.05.16
Как без лишних вопросов выключить комп под WinXP?


1-1083252087
ЧупаЧупс
2004-04-29 19:21
2004.05.16
vtChart + setuper





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский