![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сортировка символьного поля как целочисленное [D7, FB 1.5]
Ganda © (2008-01-04 10:47:00)проблема заключается в следующием, поле имеет тип символьный, туда по идеи должны записыватся числа, но бывает проскальзывают и символы!
из за этого неполучается нормально отсортировать поле!
Хотелось что бы в начале были списка были символы а потом шли нормальная нумерация!
VadimSpb (2008-01-04 13:05:00) [21]
> Sergey13 © (04.01.08 11:17) [1]
Бредовая идея не понравится юзерам.
Вопрос автора абсолютно законен. Какой применить тип поля кроме символьного если есть номера домов и квартир с буквами? Например: 10A.
В общем ситуация типовая и странно, что нет известных типовых решений.
Решил это ХП, вот часть кода:
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add('SELECT Name FROM sysobjects WHERE Name=''Sorted''');
ADOQuery.Close;ADOQuery.Open;
if ADOQuery.Fields[0].AsString='' then
begin
ADOCommand.CommandText :=
'CREATE FUNCTION Sorted(@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 ';
ADOCommand.Execute;
end;
sniknik (2008-01-04 12:35:00) [22]> которая возвращает -1, если поле нечисловое ...
> ... в запросе написать
> ORDER BY Fun(Field1)
тогда сортировка символов в начале "пойдет нафиг"...
конечно если она и не нужна то все ok, нужна, тогда придется разбивать поле на 2 символы и числа, и сортировать по двум полям (в символы там где число "состоялось" писать последнюю букву "Я").
или приводить числа к строке в определенном формате, с фиксированной длинной, вроде
а //символ
с //символ
Я0000000001 //число
Я0000099999 //число
тогда можно обойтись и одним полем по которому сортировать.
кстати если там у тебя не символы, а строки, то формировать строку из числа нужно быдет так ЯЯЯЯЯЯ99999... догадайся почему.
и естествено это поле только для сортировки, показывать нужно оригинальное.
palva (2008-01-04 12:15:00) [23]Можно написать числовую UDF-функцию от поля, которая возвращает -1, если поле нечисловое, и само поле, если поле числовое. А в запросе написать
ORDER BY Fun(Field1)
Единственное, что непонятно, это как можно подключить использование индекса. Не знаю, бывают ли в FB вычисляемые поля.
ganda (2008-01-04 12:11:00) [24]ок спаисобо
Sergey13 (2008-01-04 12:05:00) [25]> [2] Ganda © (04.01.08 12:00)
Ну попробуй добавить отдельное "сортировочное" поле и заполнять его тригером (возможно с вызовом UDF) по указанной ранее схеме.
Ganda (2008-01-04 12:00:00) [26]структура базы создавалась очень давно и переделывать её боюсь слишком много будет криков
Sergey13 (2008-01-04 11:17:00) [27]Ну так как сделал - так и работает.
Для "правильной" сортировки строки как числа, строки должны иметь одинаковое число символов, т.е. быть дополнеными слева одинаковым символом (например "0"). Символы которые у тебя "проскальзывают" оказывают естественное влияние на сортировку. Хочешь нормальной сортировки - переделывай структуру таблицы на нормальную, т.е. используй правильные типы для полей.