avshap: (Default)
avshap ([personal profile] avshap) wrote2006-08-03 11:55 am

Те же и СУБД

Дано: большая таблица. Есть колонка, содержащая целочисленные данные. Таблицу (вернее результат SELECT)нужно рассортировать, но не просто, а в примерно таком виде:

==
7
72
721
7212
722
73
8
===
т.е. а-ля "sort"

Это как нибудь можно сделать на стороне БД, без преобразований int-string и обратно?

[identity profile] ping-ving.livejournal.com 2006-08-03 06:17 am (UTC)(link)
На стороне БД, но с преобразованием.
Можно, конечно, не использовать to_char, но тогда нечто, to_char аналогичное, придётся делать руками.

А теперь по делу.
Что это за числа, которые нужно сортировать вот так?

Телефонные коды

[identity profile] avshap.livejournal.com 2006-08-03 08:04 am (UTC)(link)
Хотя, вообще-то, создание БД с программой для поиска максимально дешёвого оператора для каждого направления.
Мне полагается вручную перелопатить матрицу n*10^4*m*10^2 (где n и м меньше еденицы, но больше нуля). При это матрицу надо изготовить самостоятельно из полутора десятков экселевских таблиц.

[identity profile] sergey-ilyin.livejournal.com 2006-08-03 06:17 am (UTC)(link)
Без преобразований нельзя, но преобразования могут быть и неявными, в процессе селекта

типа

SELECT Int1
FROM SuperTable
ORDER BY convert(varchar(10), Int1)

[identity profile] schtsch.livejournal.com 2006-08-03 06:19 am (UTC)(link)
Без преобразований хотя бы туда - никак.

Ежели речь все о тех же телефонных кодах, то на фига вообще делать этот столбец целым. Или Вам надо вычислять средний международный код за неделю?

Я о том же.

[identity profile] ping-ving.livejournal.com 2006-08-03 06:23 am (UTC)(link)
Если числа нужно сортировать так - то это, скорее всего, не числа.

Re: Я о том же.

[identity profile] gogaxxx.livejournal.com 2006-08-03 07:14 am (UTC)(link)
место на диске экономят, хехе

[identity profile] sergey-ilyin.livejournal.com 2006-08-03 06:32 am (UTC)(link)
Согласен

[identity profile] avshap.livejournal.com 2006-08-03 08:05 am (UTC)(link)
Мне надо (согласно моим функциональным обязанностям) ещё вчера перелопатить матрицу из нескольких десятков тысяч элементов и найдти самых дешёвых операторов для каждого направления. ;)

????

[identity profile] ping-ving.livejournal.com 2006-08-03 08:18 am (UTC)(link)
А при чём здесь описанная сортировка?
Цены - в рублях, числа.
Коды - в цифрах, строки.

Re: ????

[identity profile] avshap.livejournal.com 2006-08-03 08:24 am (UTC)(link)
А притом, что всё это ещё и отсортировать.

Если по направлениям

[identity profile] ping-ving.livejournal.com 2006-08-03 08:37 am (UTC)(link)
То хранить префиксы в виде number, а не строк - идея плохая изначально.
Это всё-таки строки.

[identity profile] schtsch.livejournal.com 2006-08-03 08:21 am (UTC)(link)
Сочувствую.

Если Вам нужно разовое и быстрое решение, то можно из екселя все повыгружать в текстовые файлы, любым простым для Вас способом (хоть скриптом на перле) привести все файлы к одноой структуре типа
<Код(наименование) оператора>, <Код направления>, <Цена>.
Импортировать все файлы в одну табличку хотя бы в Аксесс и дальше уже колдовать с селектами и прочей БДвской байдой.

[identity profile] schtsch.livejournal.com 2006-08-03 08:28 am (UTC)(link)
Впрочем Вы, скорее всего, что-то такое уже сделали.

[identity profile] alex-mashin.livejournal.com 2006-08-03 06:39 am (UTC)(link)
В принципе, без преобразований можно. Надо упорядочить по мантиссе числа. Для этого надо получить десятичный логарифм, взять от него целую часть, возвести десять в эту степень, и разделить на это сортируемое число.
Примерно так:
ORDER BY (number_to_sort / POWER (10, FLOOR (LOG10(number_to_sort))))

[identity profile] sergey-ilyin.livejournal.com 2006-08-03 06:40 am (UTC)(link)
Ваабче-то, в строку преобразовать дешевле ;)

[identity profile] old-colonel.livejournal.com 2006-08-03 07:05 am (UTC)(link)
В строках и держать дешевле.
Что-то мну подсказывает, что это на самом деле ни разу не числа.
И как-либо считать их никто не предполагает.
;)

[identity profile] schtsch.livejournal.com 2006-08-03 07:08 am (UTC)(link)
Мсье знает толк...

тогда почему не

select
number_to_sort, logg log10(number_to_sort)
from table1
order by (logg - floor(logg))


О-о-о-о!!!

[identity profile] alex-mashin.livejournal.com 2006-08-03 07:32 am (UTC)(link)
Возможно, псевдоним в ORDER BY надо будет заменить на сам логарифм.
В любом случае, Вы предлагаете упорядочить по дробной части логарифма. Практически, Вы прологарифмировали моё выражение сортировки. Поскольку логарифм монотонно возрастает, то это тоже будет работать. Причём, я полагаю, быстрее и проблем с типами и переолнениями не возникнет.
Правда у меня MS SQL Server упорно пустую таблицу выдаёт.