Java SQL按同一列的两组条件排序
保存在我的SQLite数据库表中,我有一个列,以人性化的形式表示文件大小。例如,“大小”列中的值可以是20.5mb、350kb或900b。我想知道如何使用ORDERBY查询首先按大小排序文件大小 目前,我可以按tb、gb、mb、kb、b订购。因此,它们的顺序大体上是正确的。但是,在按文件大小单位排序时,我需要按文件大小完全正确地排序。这是我目前的问题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
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。