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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.082 c
1-1148911803
.ruslan
2006-05-29 18:10
2006.07.09
...поверх всех приложений


2-1150407291
Просьба
2006-06-16 01:34
2006.07.09
Как передать в класс рекорд?


8-1138560030
ZeFiR
2006-01-29 21:40
2006.07.09
Flash


15-1150191747
vajo
2006-06-13 13:42
2006.07.09
Текст в диплом участникам соревнований


1-1148903442
Priest
2006-05-29 15:50
2006.07.09
ClassInfo у класса Exception