Текущий архив: 2008.06.08;
Скачать: CL | DM;
Вниз
сортировка символьного поля как целочисленное Найти похожие ветки
← →
Ganda © (2008-01-04 10:47) [0]проблема заключается в следующием, поле имеет тип символьный, туда по идеи должны записыватся числа, но бывает проскальзывают и символы!
из за этого неполучается нормально отсортировать поле!
Хотелось что бы в начале были списка были символы а потом шли нормальная нумерация!
← →
Sergey13 © (2008-01-04 11:17) [1]Ну так как сделал - так и работает.
Для "правильной" сортировки строки как числа, строки должны иметь одинаковое число символов, т.е. быть дополнеными слева одинаковым символом (например "0"). Символы которые у тебя "проскальзывают" оказывают естественное влияние на сортировку. Хочешь нормальной сортировки - переделывай структуру таблицы на нормальную, т.е. используй правильные типы для полей.
← →
Ganda © (2008-01-04 12:00) [2]структура базы создавалась очень давно и переделывать её боюсь слишком много будет криков
← →
Sergey13 © (2008-01-04 12:05) [3]> [2] Ganda © (04.01.08 12:00)
Ну попробуй добавить отдельное "сортировочное" поле и заполнять его тригером (возможно с вызовом UDF) по указанной ранее схеме.
← →
ganda © (2008-01-04 12:11) [4]ок спаисобо
← →
palva © (2008-01-04 12:15) [5]Можно написать числовую UDF-функцию от поля, которая возвращает -1, если поле нечисловое, и само поле, если поле числовое. А в запросе написать
ORDER BY Fun(Field1)
Единственное, что непонятно, это как можно подключить использование индекса. Не знаю, бывают ли в FB вычисляемые поля.
← →
sniknik © (2008-01-04 12:35) [6]> которая возвращает -1, если поле нечисловое ...
> ... в запросе написать
> ORDER BY Fun(Field1)
тогда сортировка символов в начале "пойдет нафиг"...
конечно если она и не нужна то все ok, нужна, тогда придется разбивать поле на 2 символы и числа, и сортировать по двум полям (в символы там где число "состоялось" писать последнюю букву "Я").
или приводить числа к строке в определенном формате, с фиксированной длинной, вроде
а //символ
с //символ
Я0000000001 //число
Я0000099999 //число
тогда можно обойтись и одним полем по которому сортировать.
кстати если там у тебя не символы, а строки, то формировать строку из числа нужно быдет так ЯЯЯЯЯЯ99999... догадайся почему.
и естествено это поле только для сортировки, показывать нужно оригинальное.
← →
VadimSpb (2008-01-04 13:05) [7]
> 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;
← →
Sergey13 © (2008-01-04 13:08) [8]> [7] VadimSpb (04.01.08 13:05)
> Бредовая идея не понравится юзерам.
А при чем тут юзеры? Ты посвящаешь своих в тонкости реализации? Сочувствую.
← →
VadimSpb (2008-01-04 13:16) [9]Глупости, разумеется не посвящаю. Смотреть на нули они конечно будут, даже заполненные без их участия, но при этом возникает сакраментальный вопрос о профессионализме автора ;-))), который иначе не может сделать сортировку.
← →
Sergey13 © (2008-01-04 13:19) [10]> [9] VadimSpb (04.01.08 13:16)
> Смотреть на нули они конечно будут, даже заполненные без
> их участия, но при этом возникает сакраментальный вопрос
> о профессионализме автора ;-))), который иначе не может
> сделать сортировку.
А у меня вот возникает сакраментальный вопрос о профессионализме автора этого утверждения, который не знает, что сортировать и показывать можно РАЗНЫЕ поля.
← →
VadimSpb (2008-01-04 13:22) [11]Зачем? Впрочем, кому как удобнее.
← →
Sergey13 © (2008-01-04 13:32) [12]> [11] VadimSpb (04.01.08 13:22)
> Зачем?
Например в моем варианте код вычисления поля будет выполняться 1 раз при вставке + число возможных модификаций поля. В твоем варианте код будет выполняться по числу запросов. Ну и что лучше?
Прежде чем обвинять других в глупости не мешало бы понять и разобраться.
← →
VadimSpb (2008-01-04 13:39) [13]В глупости я тебя не обвинял, не обижайся, и в мыслях не было.
Вариант с ХП мне кажется значительно удобнее:
1. Не усложняется код и его чтение вторым полем.
2. ХП вызывается только при необходимости сортировки по данному полю. Работает очень быстро.
← →
Andrey © (2008-01-04 14:02) [14]>VadimSpb (04.01.08 13:39) [13]
Вот так последователи технологий микрософта приближают тепловую смерть вселенной... учитесь, товарищи )
10A - да, ситуация типовая, решается разнесением числовой составляющей и символьной по разным полям. Изначально решается. На этапе проэктирования при включении в таблицу такой сущности, как адрес дома.
← →
VadimSpb (2008-01-04 14:30) [15]
> Andrey © (04.01.08 14:02) [14]
См. [13].
Также есть варианты непрогнозируемого смешения букв и цифр.
← →
Andrey © (2008-01-04 14:37) [16]>VadimSpb (04.01.08 14:30) [15]
Посмотрел. "непрогнозируемого смешения букв и цифр" - "бардак систематизировать нельзя".
← →
Johnmen © (2008-01-04 14:40) [17]Символьные поля должны сортироваться как символьные. Числовые, как числовые.
Вот и вся недолга.
Если какому-то извращенцу надо что-то своё, то пусть и выдумает свои правила, и применит их... Проблем-то нет...
← →
VadimSpb (2008-01-04 14:41) [18]
> "бардак систематизировать нельзя".
Эмоции.
> "непрогнозируемого смешения букв и цифр"
Мой вариант это решает.
← →
VadimSpb (2008-01-04 14:43) [19]
> Символьные поля должны сортироваться как символьные. Числовые,
> как числовые.
В каком Уставе это написано? Похоже на приемы военного программирования :-))
Жизнь многогранна ...
← →
Johnmen © (2008-01-04 14:49) [20]Ты из контекста не дергай, ты до конца дочитывай.
← →
VadimSpb (2008-01-04 14:56) [21]
> Если какому-то извращенцу надо что-то своё, то пусть и выдумает
> свои правила, и применит их... Проблем-то нет...
Можно почесать правой ногой левое ухо. Мне неудобно и быстрее рукой, и в любом месте. Так и мое решение с ХП. Пока не вижу ни одного аргумента в этой переписке чем лучше второе поле. Изначально именно так и работал ранее. Потом пришел к выводу что ХП просто удобнее, для всех вариантов (дом, кв-ра, тлф с кодом и прочее).
← →
Johnmen © (2008-01-04 15:01) [22]
> VadimSpb (04.01.08 14:56) [21]
Да не стОит так переживать - у тебя самое гениальное решение. Это все уже поняли и согласны.
ЗЫ
Ему про Фому, а он про Ерему.
← →
VadimSpb (2008-01-04 15:03) [23]Ага :-)))
То сейчас тебе хотел написать!!!!
С НОВЫМ ГОДОМ!!!
← →
Andrey © (2008-01-04 15:26) [24]>VadimSpb (04.01.08 14:41) [18]
>Эмоции.
Да, вы меня улыбаете. За что вам отдельное спасибо.
С Новым Годом )
← →
Iskander © (2008-01-04 16:47) [25]А чё, в фаэрбёрде нельзя индекс построить по вычисляемому значению? зачем дополнительные поля таблице создавать?
← →
palva © (2008-01-04 23:37) [26]А чё, разве можно? Я лично даже не пробовал, раз в книжках пишут, что нельзя. Но если у вас на FB 1.5 получилось, то научите, как.
← →
Виталий Панасенко(дом) (2008-01-05 09:11) [27]в 2-ке можно
Страницы: 1 вся ветка
Текущий архив: 2008.06.08;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.03 c