Как сортировать MySQL столбец, который имеет данные в байтах КБ МБ ГБ? - PullRequest
2 голосов
/ 05 января 2011

У меня есть таблица со столбцом «размер», размеры файлов которого выражены в единицах разницы, таких как «10 КБ», «50 МБ», «1 ГБ».Проблема в том, что когда я пытаюсь отсортировать, сначала возвращается строка 1 ГБ.

Как решить эту проблему без изменения старых данных ???

Любая помощь очень ценится ... Спасибо.

Ответы [ 2 ]

2 голосов
/ 05 января 2011

Вы должны либо преобразовать все данные в общую единицу (скажем, в байтах), либо добавить столбец, содержащий «единицу измерения», и оставить столбец размера числовым.

Сказав это, следующие данные должны работать с данными, которые заканчиваются либо ГБ / МБ / КБ, либо B.

select size
  from t
 order 
    by case when size like '%GB' then power(1024, 3) * substr(size, 1, length(size) - 2)
            when size like '%MB' then power(1024, 2) * substr(size, 1, length(size) - 2)
            when size like '%KB' then power(1024, 1) * substr(size, 1, length(size) - 2)
            when size like '%B'  then                  substr(size, 1, length(size) - 1)
        end desc;


+-------+------------+
| size  | bytes      |
+-------+------------+
| 1GB   | 1073741824 |
| 10MB  | 10485760   |
| 100KB | 102400     |
| 1000B | 1000       |
+-------+------------+
1 голос
/ 05 января 2011

Размер должен содержать фактические значения и форматировать их где-то выше (на ваш взгляд).

Или вы можете сделать это безобразно и написать функцию, которая принимает удобочитаемое значение и возвращает действительное целое число, а затем SORT BY foo (size). Я упоминал, что это некрасиво?

РЕДАКТИРОВАТЬ: Поскольку вы хотите сохранить старые данные, вот еще одно уродливое решение:

Сортировка по ЗАМЕНЕ (ЗАМЕНА (ЗАМЕНА (размер, «ГБ», «000 МБ»), «МБ», «000 КБ»), «ГБ», «000»)

(я в огне!)

Disclamer: вы действительно ДОЛЖНЫ изменить данные, это единственный способ сохранить их в чистоте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...