Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];

Вниз

ORDER BY   Найти похожие ветки 

 
VadimSpb   (2006-05-04 02:11) [0]

Добрый день!
Сортирую целые числа "... ORDER BY Flat"
Получаю:
0
4
44
456
5

Сделал иначе: "... ORDER BY CAST(Flat AS DOUBLE PRECISION)"
Получил как и нужно:
0
4
5
44
456

Почему такая "беда" при сортировке целых чисел в первом варианте?


 
Плохиш ©   (2006-05-04 02:34) [1]

Тип поля строковый?


 
Anatoly Podgoretsky ©   (2006-05-04 08:48) [2]

Врешь, ты сортируешь строковые поля


 
VadimSpb   (2006-05-04 08:55) [3]

Точно - строковый. Забыл, что когда-то номера квартир сделал строками - иногда буквы попадаются.
Сорри, вопрос закрыт, тему в корзину. Посыпаю голову пеплом.


 
Desdechado ©   (2006-05-04 12:50) [4]

> ORDER BY CAST(Flat AS DOUBLE PRECISION)
на буквочках не падает?


 
VadimSpb   (2006-05-06 12:16) [5]

Если будут буквы, конечно падает.
Как совместить возможность использования цифр и букв с возможностью "цифровой" сортировки?


 
Sergey13 ©   (2006-05-06 12:19) [6]

2 [5] VadimSpb   (06.05.06 12:16)
Разделить 1 поле на 2 составляющих поля с соответстующими типами.


 
Genry   (2006-05-06 12:22) [7]


> VadimSpb   (06.05.06 12:16) [5]


> Как совместить возможность использования цифр и букв с возможностью
> "цифровой" сортировки?

При записи в базу дополнять слева нулями до общей длины поля.
Соотв. при отображении на клиенте придется немного пошаманить


 
Johnmen ©   (2006-05-06 12:23) [8]

Особенно интересна ситуация 4a5b7c
:)))


 
VadimSpb   (2006-05-06 12:26) [9]


> Разделить 1 поле на 2 составляющих поля с соответстующими
> типами.


Просто использовать 2 поля неполучится:

> Особенно интересна ситуация 4a5b7c

Как кто решает эту проблему?


 
Johnmen ©   (2006-05-06 12:30) [10]


> Как кто решает эту проблему?


В зависимости от того, что требуется на выходе. Т.е. какова логика.


 
Sergey13 ©   (2006-05-06 12:30) [11]

2[9] VadimSpb   (06.05.06 12:26)
> Просто использовать 2 поля неполучится:
Почему? В номерах квартир реально встречаются 4a5b7c?


 
Genry   (2006-05-06 12:34) [12]


> VadimSpb   (06.05.06 12:26) [9]


> > Особенно интересна ситуация 4a5b7c
>
> Как кто решает эту проблему?


Для начала надо в голове понять, в какой позиции должно стоять это (4a5b7c) в отсортированном списке квартир
Вполне возможно, что способ [7] вполне подойдет.


 
VadimSpb   (2006-05-06 12:34) [13]

На выходе надо
1
3

333

а не

1
3
333


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


 
Sergey13 ©   (2006-05-06 12:37) [14]

2[13] VadimSpb   (06.05.06 12:34)
Так почему 2 поля не обеспечат нужное?


 
Ega23 ©   (2006-05-06 12:44) [15]

Добавить ещё одно целочисленное поле "Порядок сортировки" и сортировать уже по нему.


 
Genry   (2006-05-06 13:01) [16]


> VadimSpb   (06.05.06 12:34) [13]


попробуй, скорость правда будет невысокая

select Replicate("0", Col_Length("<Table>", "<Column>") - Len(<Column>)) + Column as TmpName,
Right(Replicate("0", Col_Length("<Table>", "<Column>") - Len(<Column>)) + Column, Len(<Column>)) as Name
from Table order by TmpName

Поле TmpName - дополненное нулями, используемое в Order By
Поле Name, уже с обрезанными нулями, его и используем на клиенте


 
Desdechado ©   (2006-05-06 13:04) [17]

я бы сделал UDF, которая возвращает строго число из номера квартиры (это порядок сортировки)
сделал бы по UDF вычисляемое поле и индекс по этому полю


 
Genry   (2006-05-06 13:05) [18]


> Genry   (06.05.06 13:01) [16]

Че-то я усложнил как-то :-)))

select Replicate("0", Col_Length("<Table>", "<Column>") - Len(<Column>)) + Column as TmpName,
<Column> as Name
from Table order by TmpName


 
Johnmen ©   (2006-05-06 13:23) [19]


> Desdechado ©   (06.05.06 13:04) [17]


Не всё так просто. Чисто № не может задавать порядок, т.к. надо ещё учитывать 5A ? 5B.


> Genry   (06.05.06 13:05) [18]


Неверно.


 
ANB ©   (2006-05-06 13:30) [20]

Имхо. Странно, дома с буквами бывают, а вот про квартиры я не слышал.


 
Sergey13 ©   (2006-05-06 13:38) [21]

2[20] ANB ©   (06.05.06 13:30)
В заграничных кинах постоянно мелькает 5С 7В - этаж+комната. 8-)


 
VadimSpb   (2006-05-06 13:42) [22]

Бывают еще как!

По сути данный вопрс принципиален. Есть еще поле "Номер договора", что также может подразумевать не только цифры ...
Мой вопрос не оригинален, думаю многие с ним сталкиваются.

> Добавить ещё одно целочисленное поле "Порядок сортировки"
> и сортировать уже по нему.

Логично, надо поюзать.


 
Sergey13 ©   (2006-05-06 13:45) [23]

Мне просто интересно - чем 2 поля для квартир не подходят?

>По сути данный вопрс принципиален. Есть еще поле "Номер договора", что также может подразумевать не только цифры ...

Тебе уже давали на него принципиальный ответ [12] Genry   (06.05.06 12:34)


 
Desdechado ©   (2006-05-06 13:46) [24]

Johnmen ©   (06.05.06 13:23) [19]
согласен
я ж дал эскиз :)

ANB ©   (06.05.06 13:30) [20]
бывают, и у нас тоже, особенно когда коммуналку повыкупают по частям, пробивают отдельный вход в каждую и, чтоб не сбивать нумерацию квартир в доме, просто буквы дописывают


 
Genry   (2006-05-06 13:55) [25]


> Johnmen ©   (06.05.06 13:23) [19]


> Неверно.


Для тех условий что привел автор - верно.


 
Shirson ©   (2006-05-06 14:03) [26]

5С можно представить как 5 + дробная часть, которая равна, скажем, ASCII-коду или чего-уж-там.
Т.е. 5С = 5.067, в то время как 333 = 333.000
Соответсвенно при сортировке получим

333

Если же могут присутсвовать варианты 5С7G, то нужно определиться, "что старше", буква или цифра. Либо приводить запись к варианту "двусхотпятидесятитятиричности" :) для расширенного набора букв, а если только латинские,то хватит и "сорокаричности"
123456789ABCDEFGHIJKLMNOP...

5С7G = 16(G) + 7*40 + 12(C)*40*40 + 5*40*40*40 = 339496
5С8A = 10 + 320 + 19200 + 320000 = 339530
6 = 6*40*40*40 = 384000

Красота. Но для заранее ограниченного количества разрядов в записи


 
Johnmen ©   (2006-05-06 14:06) [27]


> Genry   (06.05.06 13:55) [25]
> Для тех условий что привел автор - верно.


А я то сразу и не догадался, что у автора только 4 квартиры: 1, 3, 333 и 5А.
:)


 
Genry   (2006-05-06 14:15) [28]


> Johnmen ©   (06.05.06 14:06) [27]


> А я то сразу и не догадался


Скорей не догадался что автор не привел четкий алгоритм сортировки, который ему требуется. Либо мсье - телепат :-)


 
VadimSpb   (2006-05-06 19:34) [29]


> Shirson ©   (06.05.06 14:03) [26]

Пока представляется лучшим универсальным решением.
Я не циклюсь на 5А, И7 и т.д. Лучше всего иметь универсальный алгоритм. Завтра может понадобится:

> Особенно интересна ситуация 4a5b7c

Странно видеть такой разброс мнений по данной проблеме, предполагал, что номер квартиры, договора и т.п. д.б. сплошь и рядом. Значит решается все ограничениями для пользователя. Количество разрядов - наименьшее из зол. Да и взять можно с разумным запасом.
Спасибо всем.


 
Anatoly Podgoretsky ©   (2006-05-06 20:51) [30]

VadimSpb   (06.05.06 13:42) [22]
Оно даже подразумевает, что это совсем не номер.


 
VadimSpb   (2006-05-06 23:38) [31]

Разве номер не м.б. 4a5b7c???


 
VadimSpb   (2006-05-07 11:38) [32]


> 123456789ABCDEFGHIJKLMNOP...
>
> 5С7G = 16(G) + 7*40 + 12(C)*40*40 + 5*40*40*40 = 339496
> 5С8A = 10 + 320 + 19200 + 320000 = 339530
> 6 = 6*40*40*40 = 384000
>
> Красота.

Красота здесь с ошибкой. Попробуйте вычислить 60. Или 100. А идея красивая :-)))


 
Shaman_Naydak   (2006-05-09 04:43) [33]

CREATE FUNCTION GetAlignedFlatNumber(@FlatNumber varchar(32))
RETURNS varchar(32)
AS
BEGIN
 declare @Result varchar(32)
 declare @ind int
 if @FlatNumber is not null
 begin
   set @ind = PATINDEX("%[^0-9]%", @FlatNumber)
   if @ind = 0
     set @ind = LEN(@FlatNumber) + 1
   set @Result = REPLICATE(" ", 10 - @ind) + @FlatNumber
 end
 RETURN @Result
END


 
VadimSpb   (2006-05-09 17:52) [34]


> Shaman_Naydak   (09.05.06 04:43) [33]

И как это планируется сортировать?

Остановился пока на идее


 
VadimSpb   (2006-05-09 18:05) [35]

> Shaman_Naydak   (09.05.06 04:43) [33]

И как это планируется сортировать?

Остановился пока на идее Shirson ©   (06.05.06 14:03) [26] c некоторыми поправками. Привязываюсь к ASCII коду, 255 символов.
Число разрядов будет ограничено из-за быстрого увеличения результата вычислений, поэтому тип сортируемого поля выбрал DECIMAL(38,18) и делю на 1000000000000000000. Отладочный вариант:
 
DECLARE @y INT
DECLARE @n INT
DECLARE @HS DECIMAL(38,18)
DECLARE @Pos varchar(max)
DECLARE @TMP1 varchar(max)
SET @HS=0
SET @y=0
SET @TMP1= /edFlat.Text/  
SET @n=LEN(@TMP1)
WHILE @y<@n
 BEGIN
   SET @Pos=SUBSTRING(@TMP1,@y+1,1)
   SET @HS=@HS + (ISNULL(ASCII(@Pos)*(POWER(255,@n-1-@y)),0))/1000000000000000000
   SET @y=@y+1
 END
UPDATE Addresses SET FlatSort = @HS
WHERE AddressID= /IntToStr(AdrPOS)/


На 12 разрядов хватает, а боьше наверное и не надо для полностью универсального варианта. Учитываются буквы и цифры, национальная раскладка клавиатуры, верхний и нижний регистр. Вариант можно развить для оптимизации. Алгоритм нормально работает.


 
Shaman_Naydak   (2006-05-09 20:11) [36]

Мда.. Любитель, вы батенька поизвращаться..

А сортировать планировалось так:

Order by GetAlignedFlatNumber(FlatNumber)

Если уж вы так озабочены скоростью работы, а памяти вам не жалко,
то определите ф-цию с WITH SCHEMABINDING
Добавьте в таблицу вычисляемое поле FlatSort = GetAlignedFlatNumber(FlatNumber)
и создайте по этому полю индекс...
Удачи в извращениях.. я шучу ;)


 
VadimSpb   (2006-05-09 20:18) [37]

Не все так просто как кажется ;-)))
И какой тип поля предполагаете?
Учтите, что 255 надо возводить в степень неоднократно


 
Shaman_Naydak   (2006-05-09 20:28) [38]

Уважаемый... я не пытаюсь влезть в ваши хитроумные одиссейские способы в превращение в число с плавающей точкой..
Мой способ - простой и незатейливый как грабли.
У вас есть строковое поле квартир и вам надо его отсортировать в "правильном" порядке..
Для этого надо выравнять по правому краю.. для этого слева добиваются необходимым числом пробелов (у меня в примере) до 10. Вы проверьте код, пожалуйста, а уж потом будем дискутировать.


 
VadimSpb   (2006-05-09 20:54) [39]

Действительно все просто :-))


 
VadimSpb   (2006-05-09 22:34) [40]

Shaman_Naydak   (09.05.06 20:28) [38]
Сделал универсальную хранимку на сервере. Все замечательно работает.
И не надо извратов в виде дополнительных полей. Спасибо!



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

Форум: "Базы";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.009 c
6-1133458989
ZeFiR
2005-12-01 20:43
2006.07.09
Вопрос по созданию веб-браузера...


1-1148558415
Juice
2006-05-25 16:00
2006.07.09
Как удалить в RunTime экшен из TActionManager a ?


8-1138452664
Universe
2006-01-28 15:51
2006.07.09
Большие изображения


15-1149869397
dimodim
2006-06-09 20:09
2006.07.09
AT2ATX


2-1150726284
Кефир87
2006-06-19 18:11
2006.07.09
HELP!!! OVERLAY.TPU





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