从文件大小范围内的 SQL 表中选择行

Posted

技术标签:

【中文标题】从文件大小范围内的 SQL 表中选择行【英文标题】:Select rows from SQL table within file size range 【发布时间】:2019-08-14 10:43:43 【问题描述】:

我的表格中有一个列,它以人类友好的格式表示文件大小。例如,25MB、300B、76.5KB 等。我将如何编写一个查询来选择大小范围内的行?例如 150kb 和 6mb 之间或 35mb 和 1.2GB 之间?

我已经学会了如何按文件大小排序,这是一个类似的问题,但我无法将其用于这些目的。

我可以获得一些在我范围内的文件,但像 9mb 这样的文件将比 150mb 文件排序。

【问题讨论】:

将所有行的文件大小存储在一个恒定单位中,我建议使用字节,然后按此过滤。为人类可读的值留一个单独的列。 @RoryMcCrossan 我知道我可以做到,而且查询很容易。但这不是我要解决的问题。但我希望在我当前的项目中这样做。 在这种情况下,您需要结合一些丑陋的逻辑来根据人类可读的字符串计算出字节大小。这不会是快速或可扩展的。 【参考方案1】:

您可以将值转换为实际数字。一种方法是显式翻译每个后缀:

select (case when size like '%KB' then 1000
             when size like '%MB' then 1000000
             when size like '%GB' then 1000000000
             else 1
        end) * (size + 0.0)
from table_name 
where size between 750 and 1000

两个音符。诸如“MB”之类的后缀是模棱两可的。它可以表示 1,000,000 或 2^20 (1,048,576)。这意味着这些因素可能不同。

size + 0.0 使用 SQLite 的功能进行基于前导数字的隐式转换。

【讨论】:

【参考方案2】:

您可以通过将Row Values 存储在CTE 中的方式来做到这一点

with cte(suffix, bytes) as (
  select * from (
    values 
      ('B', 1), ('KB', 1024), ('MB', 1024 * 1024), 
      ('GB', 1024 * 1024 * 1024), ('TB', 1024 * 1024 * 1024 * 1024)
  )
)
select f.* from filtered f 
where 
  f.size * (select max(bytes) from cte where f.size like '%' || suffix) 
  between 
  '150MB' * (select max(bytes) from cte where '150MB' like '%' || suffix) 
  and 
  '6GB' * (select max(bytes) from cte where '6GB' like '%' || suffix) 

'150MB''6GB' 替换为您的搜索值。 请参阅demo。

【讨论】:

以上是关于从文件大小范围内的 SQL 表中选择行的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView:当多个元素在同一文档中使用该大小时,某些大小范围内的文本以错误的大小呈现

求批处理统计文件夹内的所有文件的数量和总大小

SQL从日期范围内的同一表中的不同记录中获取多个项目的总和(ORACLE)

从 Sql 中的表中选择不同的日期间隔

使用 Athena / Presto 从多个表返回 SQL 数据,受 1 个表中的日期范围限制

怎么设置 hexo 的文章内的图片大小