Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сортировка символьного поля как целочисленное [D7, FB 1.5]


Страницы:   1 2

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"). Символы которые у тебя "проскальзывают" оказывают естественное влияние на сортировку. Хочешь нормальной сортировки - переделывай структуру таблицы на нормальную, т.е. используй правильные типы для полей.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо