所以,我有一张 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/