Сортировка чисел в varchar

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
raycom
Сообщения: 5
Зарегистрирован: 08 фев 2006, 18:19

Сортировка чисел в varchar

Сообщение raycom » 08 фев 2006, 18:28

Нужно отсортировать так, что бы получилось
1
2


11
21
а не
1
11
2
21


Может кто чего-нибудь посоветует?

smu
Сообщения: 39
Зарегистрирован: 29 окт 2005, 10:12

Re: Сортировка чисел в varchar

Сообщение smu » 08 фев 2006, 19:14

raycom писал(а):Нужно отсортировать так, что бы получилось
...


...
3б - таких чисел не бывает, сколько в ВУЗе не учил математику :D -не встречал. Разве какая-то хитрая система .. FF

Самый простой способ
1. Создаете дополнительный столбец тип double precision
2. Используете умный update к новому столбцу

3 -> 3.0
3a -> 3.01
3б -> 3.02
11 -> 11.0

3. Выводите старый столбец, сортируете по новому.

P.S. Update потребует использование UDF, кажется ...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 08 фев 2006, 19:36

число в строке - это строка, а не число. Соответственно, содержимое строк подчиняется правилам сортировки строк. Если надо сортировать числа в строке - добавляйте ведущие нули, а при показе - убирайте их.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 09 фев 2006, 10:18

Я своим операторам в приказном порядке велел вводить такие числа в виде
0001
0002
0003а
0003б
0021
и тд... вобщем административными методами. :)

raycom
Сообщения: 5
Зарегистрирован: 08 фев 2006, 18:19

Сообщение raycom » 09 фев 2006, 18:08

Мне предложили 3 варианта:
1. создать столбец с избыточной информацией
2. хватать за горло юзеров
3. програмным методом добавлять нули, которые никак не скроеш,скажем, в DBGrid, и наличие которых в начале строки будут раздражать око юзера.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 фев 2006, 18:35

которые никак не скроеш,скажем, в DBGrid
все можно скрыть. у столбца (TField) есть getText/setText, к примеру.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 10 фев 2006, 09:24

ORDER BY RPAD(<field>, 10, ' ')

smu
Сообщения: 39
Зарегистрирован: 29 окт 2005, 10:12

Сообщение smu » 12 фев 2006, 18:50

dimitr писал(а):ORDER BY RPAD(<field>, 10, ' ')
Так вроде бы получим следующее

'1000______'
'11________'
'3_________'
'3a________'
'9_________'

где '_' - пробел

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 13 фев 2006, 01:21

ну LPAD, а не RPAD. Это вроде бы тебе надо, а не другим. Так? :)

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 13 фев 2006, 15:27

да, шо-то у меня право с лево перепутались :-)

smu
Сообщения: 39
Зарегистрирован: 29 окт 2005, 10:12

Сообщение smu » 13 фев 2006, 15:47

kdv писал(а):ну LPAD, а не RPAD. Это вроде бы тебе надо, а не другим. Так? :)
К сожалению, чужие проблемы решать легче, чем свои. :) Боюсь показаться занудой, но и LPAD тоже не даст нужный результат.

'________30'
'________31'
'________3a'

Буквы создают проблемы. А так идея неплохая, пусть автор топика сам дальше копает.

raycom
Сообщения: 5
Зарегистрирован: 08 фев 2006, 18:19

Сообщение raycom » 14 фев 2006, 16:27

kdv писал(а):
которые никак не скроеш,скажем, в DBGrid
все можно скрыть. у столбца (TField) есть getText/setText, к примеру.
Спасибо, сработало прекрасно.
А с LPAD и RPAD ничего не выходит. Видимо это какие-то внешние функции? Если это так, то как их подключить к IB 7.0?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 фев 2006, 16:48


Ответить