1

我有以下 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)));

解释

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

我的问题

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

1 回答 1

1

填充0s 的一种方法是00在数字的开头连接并SUBSTR()返回最后 2 个字符。
此外,您可以除以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)

请参阅演示

于 2021-04-05T10:08:52.100 回答