【问题标题】:SQL order by two sets of criteria for the same columnSQL 按同一列的两组条件排序
【发布时间】:2019-08-13 09:03:59
【问题描述】:

保存在我的 SQLite 数据库表中,我有一列以人类友好的形式表示文件大小。例如,大小列中的值可以是 20.5mb 或 350kb 或 900b。我想知道如何使用 order by query 先按大小排序文件大小。

目前,我可以按 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 之前。

【问题讨论】:

    标签: java sql sqlite sql-order-by


    【解决方案1】:

    SQLite 在您对字符串进行算术运算(如加法)时,会将字符串文字隐式转换为数字。
    因此,当您执行以下操作时,它会将50MB 转换为5050MB + 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 = 1024 GB、1GB = 1024 MB、1MB = 1024 KB 和 1KB = 1024 B。
    【解决方案2】:

    您可以将CAST size 转换为 FLOAT(因为它以数字开头),然后将其用作辅助 ORDER BY 标准,即:

    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
    

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 2014-06-17
      • 2021-02-27
      • 2021-12-15
      • 2014-01-13
      • 1970-01-01
      • 2012-03-09
      • 2021-06-19
      • 1970-01-01
      相关资源
      最近更新 更多