Форум: "Базы";
Текущий архив: 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
5А
333
а не
1
3
333
5А
Можно просто добавлять нули, но как показывает практика требовать это от пользователя нереально, лучше самому программно.
← →
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
Соответсвенно при сортировке получим
5С
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