【问题标题】:SQLite3 - Calculated SELECT with padding and concatenationSQLite3 - 使用填充和连接计算的 SELECT
【发布时间】:2021-07-01 04:50:33
【问题描述】:

我有以下 SQLite 表(真实表的存根,它有一些其他列)

CREATE TABLE IF NOT EXISTS fingers(id INTEGER,intLL INTEGER,fracLat INTEGER,fracLng INTEGER,PRIMARY KEY(id)) WITHOUT ROWID;

此表中的一个典型条目是

INSERT INTO fingers(id,intLL,fracLat,fracLng) VALUES(1,12899,42513,4025);

有时我需要查询此表以提取行以匹配intLL 值,以使计算值满足可变条件。例如

SELECT * FROM fingers WHERE intLL = 12899 AND ('8508' = (CAST((ROUND(CAST(fracLat AS REAL)/500)) 
AS INTEGER) || CAST((ROUND(CAST(fraCLng AS REAL)/500)) AS INTEGER)));

说明

  • 通过将fractLatfracLng 列除以 10,250 或 500 来转换它们。CAST AS REAL 是防止 SQLite 执行的默认整数除法所必需的
  • 将小数结果四舍五入到最接近的整数。舍入后,默认情况下您将获得一个带有尾随 .0 的值。 CAST AS INTEGER 确保将其删除
  • 连接这两个部分。串联出错了。在本例中,连接结果将是 858 这不是我想要的
  • 与传入值进行比较:在本例中为 8508。

我的问题

  1. 如何在需要连接之前用 0 填充这两个部分,以确保它们具有相同的位数
  2. 有没有更简单的方法来实现这一点?

【问题讨论】:

    标签: sqlite concatenation calculated-columns zero-padding


    【解决方案1】:

    填充0s 的一种方法是在数字的开头连接00,并用SUBSTR() 返回最后两个字符。
    此外,您可以除以500.0 以避免整数除法:

    SELECT * FROM fingers 
    WHERE intLL = 12899 
    AND '8508' = SUBSTR('00' || CAST(fracLat / 500.0 AS INTEGER), -2) || 
                 SUBSTR('00' || CAST(fraCLng / 500.0 AS INTEGER), -2)
    

    另一种方法是使用函数printf() 格式化数字:

    SELECT * FROM fingers 
    WHERE intLL = 12899 
    AND '8508' = printf('%02d', fracLat / 500.0) || 
                 printf('%02d', fraCLng / 500.0)
    

    请参阅demo

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 2015-04-01
      相关资源
      最近更新 更多