sqlite - TEXT 列上 WHERE 子句的奇怪 sqlite3 行为

标签 sqlite

所以,我有一张 table 。

sqlite> .schema
CREATE TABLE data(date int primary key, temp text, humi text, co2 text, coarse int);

它有一些数据,在 TEXT 列上使用 WHERE 条件可以达到我的预期:
sqlite> SELECT * FROM data WHERE temp > 26;
date        temp        humi        co2         coarse
----------  ----------  ----------  ----------  ----------
1569962962  26.01       30.97       530.34      1
1569963029  26.05       30.91       528.57      0
1569963097  26.05       30.87       530.16      0
1569963164  26.09       30.83       530.37      1
1569963232  26.09       30.84       530.75      0
1569963300  26.13       30.77       532.51      0

当我给它一个没有任何行匹配的条件时,它也符合我的期望:
sqlite> select * from data where temp > 99;
sqlite>

除非我使用 100 或 1000 等。然后它会忽略 WHERE 并给我每一行:
sqlite> select * from data where temp > 100;
date        temp        humi        co2         coarse
----------  ----------  ----------  ----------  ----------
1569967795  25.99       31.65       558.03      1
1569967863  26.01       31.60       558.78      0
1569967930  26.02       31.64       557.77      0
1569967998  26.01       31.65       556.68      1
1569968067  26.02       31.63       557.31      0
1569968134  26.04       31.64       560.01      0
1569968201  26.08       31.66       559.84      1
1569968268  26.05       31.66       563.95      0
1569968335  26.08       31.70       562.86      0
1569968403  26.09       31.69       563.85      1
1569968471  26.09       31.73       565.58      0
1569968539  26.11       31.69       566.04      0
1569968607  26.13       31.69       564.95      1
1569968674  26.13       31.62       565.51      0
1569968742  26.16       31.63       567.40      0
1569968810  26.16       31.60       568.38      1
[snip]

当然,我是通过使用 WHERE 子句执行 DELETE 操作来删除一些坏数据来发现这一点的。没关系,我现在基本不哭了。 (历史传感器数据并不重要)但是为什么是 10 的倍数?我认为它在灵活打字方面做得太聪明了,但我不知道在哪里。

最佳答案

这是因为您正在进行文本比较(由于 temp 具有 TEXT 列亲和力)所以 1 低于 200 (即字符 1 低于值 2 所以其他字符无关紧要)。

您需要强制进行数值比较,这可以通过 来完成。 Actor 例如

SELECT * FROM data WHERE CAST(temp AS REAL) > 99;

或者
SELECT * FROM data WHERE temp > CAST(99 AS REAL);

你不妨看看CAST expressions

如果 的列类型温度 列是真实的
CREATE TABLE data(date int primary key, temp REAL /*<<<<<<<<<< CHANGED */, humi text, co2 text, coarse int);` 

然后 Actor 不需要。

关于sqlite - TEXT 列上 WHERE 子句的奇怪 sqlite3 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58193136/

相关文章:

android - 如何在android中将项目添加到自定义数组列表中

ios - 如何加密/解密我的 CoreData(sqlite)?我可以使用 SQLCipher 吗?

java - 如何满足警报管理器中的预定时间列表以推送通知

mysql - 如何加快从 <我的语言> 插入 <我的 DBMS> SQL 数据库?

node.js - Sequelize object.add 不返回 id?

c# - UWP 使用 SQLite 创建数据库

iphone - iOS:Sqlite 数据库错误:由于未捕获的异常 'NSInternalInconsistencyException' 而终止应用程序,原因: 'error preparing statement'

android - SQLite获取查询数据问题

sqlite - 如何在两列之间添加新列?

android - 如何使用异步任务执行数据库操作