Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.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
Java SQL按同一列的两组条件排序_Java_Sql_Sqlite_Sql Order By - Fatal编程技术网

Java SQL按同一列的两组条件排序

Java SQL按同一列的两组条件排序,java,sql,sqlite,sql-order-by,Java,Sql,Sqlite,Sql Order By,保存在我的SQLite数据库表中,我有一个列,以人性化的形式表示文件大小。例如,“大小”列中的值可以是20.5mb、350kb或900b。我想知道如何使用ORDERBY查询首先按大小排序文件大小 目前,我可以按tb、gb、mb、kb、b订购。因此,它们的顺序大体上是正确的。但是,在按文件大小单位排序时,我需要按文件大小完全正确地排序。这是我目前的问题 SELECT * FROM filtered ORDER BY case when size like '%TB%' then 1

保存在我的SQLite数据库表中,我有一个列,以人性化的形式表示文件大小。例如,“大小”列中的值可以是20.5mb、350kb或900b。我想知道如何使用ORDERBY查询首先按大小排序文件大小

目前,我可以按tb、gb、mb、kb、b订购。因此,它们的顺序大体上是正确的。但是,在按文件大小单位排序时,我需要按文件大小完全正确地排序。这是我目前的问题

SELECT * FROM filtered
ORDER BY case when size like '%TB%'  then 1
                when size like '%GB%' then 2
              when size like '%MB%' then 3 
              when size like '%kB%' then 4
              when size like '%B%' then 5
              else 6
   end
它返回行的顺序是90MB、50MB、50.5MB、62KB、135kb


这里有一些问题。第一个是50比50.5大。第二个是9会在100之前出现,因为​ 第一个数字。

您可以
大小
转换为
浮点数
(因为它以数字开头),然后将其用作次要的
排序依据
标准,即:

SELECT * FROM filtered
ORDER BY case when size like '%TB%'  then 1
              when size like '%GB%' then 2
              when size like '%MB%' then 3 
              when size like '%kB%' then 4
              when size like '%B%' then 5
              else 6
         end, CAST(size AS FLOAT) DESC

SQLite当您对字符串文本应用算术运算(如加法)时,会隐式地将其转换为数字。
因此,当您执行以下操作时,它会将
50MB
转换为
50
50MB+0

因此,添加的结果将是
50

所以你可以这样做:

SELECT * FROM filtered 
ORDER BY 
case 
  when size like '%TB%' then 1 
  when size like '%GB%' then 2 
  when size like '%MB%' then 3 
  when size like '%kB%' then 4 
  when size like '%B%' then 5 
  else 6 
end,
size + 0 desc
或仅使用1级排序:

SELECT * FROM filtered 
ORDER BY 
size * case 
  when size like '%TB%' then 1024 * 1024 * 1024 * 1024 
  when size like '%GB%' then 1024 * 1024 * 1024
  when size like '%MB%' then 1024 * 1024 
  when size like '%kB%' then 1024 
  when size like '%B%' then 1 
  else 1 
end desc

只有一个级别的排序是非常干净的。哇!这是怎么回事?1024在做什么?1TB=1024GB、1GB=1024MB、1MB=1024KB和1KB=1024B。