Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对数据以字节为单位的mysql列进行排序?_Mysql_Search_Sorting - Fatal编程技术网

如何对数据以字节为单位的mysql列进行排序?

如何对数据以字节为单位的mysql列进行排序?,mysql,search,sorting,Mysql,Search,Sorting,我有一个列为“size”的表,它的文件大小以不同的单位表示,如“10KB”、“50MB”、“1GB”。 问题是当我尝试排序时,它首先返回1GB行 如何在不更改旧数据的情况下解决此问题 非常感谢您的帮助。。。谢谢。让“大小”包含实际值,并将其格式化到更高的位置(在您的视图中) 或者你可以把它弄得难看,然后写一个函数,它接受一个人类可读的值,返回实际的整数,然后按foo(大小)排序。我说过它很难看吗 编辑:由于您希望保留旧数据,下面是另一个丑陋的解决方案: 按替换排序(替换(替换(大小,'GB','

我有一个列为“size”的表,它的文件大小以不同的单位表示,如“10KB”、“50MB”、“1GB”。 问题是当我尝试排序时,它首先返回1GB行

如何在不更改旧数据的情况下解决此问题


非常感谢您的帮助。。。谢谢。

让“大小”包含实际值,并将其格式化到更高的位置(在您的视图中)

或者你可以把它弄得难看,然后写一个函数,它接受一个人类可读的值,返回实际的整数,然后按foo(大小)排序。我说过它很难看吗

编辑:由于您希望保留旧数据,下面是另一个丑陋的解决方案:

按替换排序(替换(替换(大小,'GB','000MB'),'MB','000KB'),'GB','000')

(我着火了!)


Disclamer:您真的应该更改数据,这是保持数据干净的唯一方法。

您真的应该将所有数据转换为一个公共单位(比如字节),或者添加一个包含“度量单位”的列,并保持大小列本身为数字

话虽如此,以下内容应适用于以GB/MB/KB或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       |
+-------+------------+

+!,, @如果你真的想把数据存储在字节中,那么在别处格式化就很容易了。我以前犯过一个错误。我以不同的格式存储数据。你建议我改变100+数千行?这是一个简单的改变。编写一个简单的脚本,在一个小但有代表性的数据集上彻底测试它,并让它通宵工作。我宁愿将大小存储在字节中,并且在输出时仅将格式设置为人类可读的格式。在我看来,长期的解决方案必须是更改这些值。一个字段应该只存储一个度量值,比如Kb,然后在需要时转换为Gb等。否则,处理数据总是有点混乱。我将所有数据更改为字节,并对我的所有应用程序使用相同的方法。+1是一个真正好的方法。很可能,每个insert和update SQLs也应该在不更改应用程序代码的情况下自动填充
bytes
列。@Nishant,呵呵。。。我希望你是指我的第一句话?否则我就不想投票了,因为这是命令#是的。我指的是新专栏。这是一个很好的补丁,如果你可以转换旧的单位,并且每次更新和插入都会处理好它,那么你就不必接触应用程序代码。我们应该得到一个+1.:)