SQLite3 - 使用填充和连接计算 SELECT
SQLite3 - Calculated SELECT with padding and concatenation
我有以下 SQLite table(真实 table 的存根,它有一些其他列)
CREATE TABLE IF NOT EXISTS fingers(id INTEGER,intLL INTEGER,fracLat INTEGER,fracLng INTEGER,PRIMARY KEY(id)) WITHOUT ROWID;
此 table 中的典型条目是
INSERT INTO fingers(id,intLL,fracLat,fracLng) VALUES(1,12899,42513,4025);
我不时需要查询此 table 以提取匹配 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 [=41] 执行的默认整数除法=]
- 将小数结果四舍五入为最接近的整数。四舍五入后,您将默认获得一个尾随
.0
的值。 CAST AS INTEGER
确保将其删除
- 连接两部分。连接出错了。在目前的情况下,连接结果将是 858 这不是我想要的
- 与传入值比较:在本例中为 8508。
我的问题
- 如何在连接前需要时用 0 填充两个部分,以确保它们具有相同的位数
- 是否有更简单的方法来实现此目的?
填充 0
s 的一种方法是在数字的开头连接 00
并与 SUBSTR()
return 最后 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)
参见demo。
我有以下 SQLite table(真实 table 的存根,它有一些其他列)
CREATE TABLE IF NOT EXISTS fingers(id INTEGER,intLL INTEGER,fracLat INTEGER,fracLng INTEGER,PRIMARY KEY(id)) WITHOUT ROWID;
此 table 中的典型条目是
INSERT INTO fingers(id,intLL,fracLat,fracLng) VALUES(1,12899,42513,4025);
我不时需要查询此 table 以提取匹配 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 [=41] 执行的默认整数除法=] - 将小数结果四舍五入为最接近的整数。四舍五入后,您将默认获得一个尾随
.0
的值。CAST AS INTEGER
确保将其删除 - 连接两部分。连接出错了。在目前的情况下,连接结果将是 858 这不是我想要的
- 与传入值比较:在本例中为 8508。
我的问题
- 如何在连接前需要时用 0 填充两个部分,以确保它们具有相同的位数
- 是否有更简单的方法来实现此目的?
填充 0
s 的一种方法是在数字的开头连接 00
并与 SUBSTR()
return 最后 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)
参见demo。