Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.023 c
2-1210576078
TUser
2008-05-12 11:07
2008.06.08
Почему это до сих пор работало?


2-1210697081
Alexey
2008-05-13 20:44
2008.06.08
Кодировка таблицы


15-1209110171
worldmen
2008-04-25 11:56
2008.06.08
Создать тест. Принцыпы создания


15-1209119813
sql
2008-04-25 14:36
2008.06.08
MS SQL 2000


15-1208330103
Иван77
2008-04-16 11:15
2008.06.08
как открыть порт.