Конференция "Базы" » сортировка по varchar [Firebird]
 
  • zorik © (18.04.08 12:20) [0]
    есть поле name типа varchar с данными: 1, 2, 10, 1-р, 21, 3-е, ...
    нужно "правильно" отсортировать данные по этому полю, тоесть:
    1, 1-р, 2, 3-е, 10, 21, ...
    order by name<code/> возвращает: 1, 10, 1-р, 2, 21, 3-е, ...
    раньше я обходил эту проблему с использованием UDF - создавал допольнительное поле SORTNAME COMPUTED BY (mysort(name))<code/>, где функция mysort возвращала преобразованое поле, например
    1-р -> 0001-р,
    10 -> 0010,
    ...

    какие будут решения, чтоб не использовать UDF?

  • Ega23 © (18.04.08 12:31) [1]
    Я обычно практически в любой таблице, где нужна сортировка, добавляю integer-поле Ord, в котором либо пользователь сам может нужный порядок проставить (чем меньше значение, тем "выше" запись будет во всех выборках), либо я сам могу этим делом управлять.

    Правда не знаю, насколько в твоей ситуации этот вариант поможет...
  • zorik © (18.04.08 12:33) [2]
    а нету в Firebird функций разделения строк. Можно бы было разделить тогда на числовую и текстовую часть?
  • zorik © (18.04.08 12:38) [3]
    Появилась идея!
    В базе хранить 2 значения: номер (числовое) и приставку(текстовую). Логику реализовать на клиенте. Когда пользователь вводит или редактирует значение - разделять стринг на две части (левая числовая, а правая - текст) и записывать в базу 2 поля

    Как только начал просить помощи, сразу идеи полезли )))
  • Anatoly Podgoretsky © (18.04.08 12:46) [4]

    > а нету в Firebird функций разделения строк.

    Что и этого нет?
  • Anatoly Podgoretsky © (18.04.08 12:48) [5]
    Ну и что ты будешь делать, если будет Ф1Б, правильный совет тебе дали в [1], где отсутствуют коллизии подобного и прочих родов.
  • Johnmen © (18.04.08 13:15) [6]

    > Anatoly Podgoretsky ©   (18.04.08 12:46) [4]
    > > а нету в Firebird функций разделения строк.Что и этого
    > нет?

    Есть :)
    не всё так плохо для любителей затыкать горой кода огрехи проектирования...
  • Anatoly Podgoretsky © (18.04.08 13:28) [7]
    > Johnmen  (18.04.2008 13:15:06)  [6]

    В следудующий раз получит от пользователей
    Вчера было 1-а/1-р, а сегодня 1-р/1-а
  • Johnmen © (18.04.08 13:40) [8]

    > Anatoly Podgoretsky ©   (18.04.08 13:28) [7]

    Я и говорю, что на проектирование своё надо смотреть :))
    А уж потом на функции...
  • zorik © (18.04.08 14:16) [9]
    1. такого по ТЗ не может быть "Ф1Б"
    2. я это огрехом проэктирования не считаю, так как это есть просто номер какого-то объекта. На 100 объектов 95 будут чисто номерные, а 5 номер + приставка

    всем спасибо
  • Anatoly Podgoretsky © (18.04.08 14:36) [10]
    > Johnmen  (18.04.2008 13:40:08)  [8]

    Но видишь ему до лампочки, что мы говорим.
  • zorik © (18.04.08 14:55) [11]

    > Anatoly Podgoretsky ©   (18.04.08 14:36) [10]

    Ну хорошо.
    Ваше решение. Как бы вы это решили. Это поле номер скважины. Сначала было integer, потом в ходе експлуатации "стали появлятся" разные 1-а, 2-р, 9Г. Сделал поле типа varchar.
    Для различных подразделений и т.д. у меня есть поле с кодом (не путать с первичным ключем), которое вносится вручную и по нему идет сортировка.

    Здесь дело не сколько во мне, а в системе стандартов. Но ее никто не будет менять, написана лет 60 назад. Нужно адаптировать все к современным требованиям. Мы работаем со старыми документами. Бывает что в таблице в одной ячейке ручкой записано 2 значения через слеш. И как тут поступить? Переделываешь тогда структуру или записываешь в базу что-то среднее

    так что, зря вы меня пинаете...
  • Johnmen © (18.04.08 14:58) [12]

    > zorik ©   (18.04.08 14:55) [11]

    Я бы решил вот так [3] с той разницей, что в одном поле, как есть, а в другом - числовое представление того, что в первом.
    Об этом и Ega23 ©   (18.04.08 12:31) [1] сказал.
  • zorik © (18.04.08 15:07) [13]
    так и решаем, а кто будет "неправильное" название вводить будем бить по шапке )))
  • Anatoly Podgoretsky © (18.04.08 15:16) [14]
    > Johnmen  (18.04.2008 14:58:12)  [12]

    Я бы сделал единственную модификацию, во втором поле умноженое на 10 и при конфликте запрашивать пользователя указать правильный порядок.
    Только вот это было integer, потом в ходе експлуатации "стали появлятся" разные 1-а, 2-р, 9Г. ему уде сказали, что может появится и не Число-литера, что угодно новое, ну не верит он в законы Мерфи и Паркинсона, как не верил в первом случае. Второе поле позволит сгладить некоторые моменты, отсрочит их на некоторе время, пока не начнут бить, надо же подготовиться к побегу.
  • Anatoly Podgoretsky © (18.04.08 15:18) [15]
    > Johnmen  (18.04.2008 14:58:12)  [12]

    Я бы сделал единственную модификацию, во втором поле умноженое на 10 и при конфликте запрашивать пользователя указать правильный порядок.
    Только вот это было integer, потом в ходе експлуатации "стали появлятся" разные 1-а, 2-р, 9Г. ему уде сказали, что может появится и не Число-литера, что угодно новое, ну не верит он в законы Мерфи и Паркинсона, как не верил в первом случае. Второе поле позволит сгладить некоторые моменты, отсрочит их на некоторе время, пока не начнут бить, надо же подготовиться к побегу.
  • Johnmen © (18.04.08 15:29) [16]

    > Anatoly Podgoretsky ©   (18.04.08 15:16) [14]

    Так я же предусмотрительно умолчал о том, как формируется числовое представление :)
    А оно может формироваться безотносительно типа исходного поля.
  • Anatoly Podgoretsky © (18.04.08 15:40) [17]
    > Johnmen  (18.04.2008 15:29:16)  [16]

    Естественно пользователь может назначить свое значение как при вводе, так и в последующем.
    Эта "проблема" стара как мир и давно решена методом обхода, а не решением по существу, эта же проблема существует только в мозгах.
  • zorik © (18.04.08 15:50) [18]

    эта же проблема существует только в мозгах

    ладно, спасибо вам! "хорошего" же вы (
    мнения обо мне )))
  • Johnmen © (18.04.08 15:56) [19]
    В данном [17] контексте слово "мозги" носит собирательный характер... :)
 
Конференция "Базы" » сортировка по varchar [Firebird]
Есть новые Нет новых   [134432   +19][b:0][p:0.001]