带十进制/浮点数比较的sqlite select查询不起作用

Mik*_*erg 4 sqlite decimal

我需要使用简单的选择来执行十进制比较操作,例如:

从table_a中选择*,其中时间> 0.0004

身份证时间


0 0.000502
1 0.000745
2 0.000725
4 0.000197
5 0.000176
6 0.000833
7 0.000269
8 0.000307
9 0.000302

结果包含确实满足比较的值。简而言之,“ time> 0.0004”始终为true,而“ time <0.0004”始终为false。

我尝试过将时间列的类型从十进制转换为float并没有成功。

如果我使用子查询,它将正确执行查询:

从table_a中选择*,其中time>(从id_8中的table_a中选择时间);

身份证时间


0 0.000502
1 0.000745
2 0.000725
6 0.000833

表创建:

CREATE TABLE“ table_a”(“ id”整数NOT NULL主键,“ time”十进制NOT NULL);

Gar*_*han 6

SQLite 有一个非正统的动态类型系统,其中列的类型并不决定列中实际数据的类型,它只是鼓励 SQLite 将数据转换为特定类型(如果可能的话)。

当尝试比较字符串和数字时,如果字符串不是格式正确的数字,则它被认为大于数字。

因此,一个明显的猜测是,由于某种原因,这些时间值实际上不是数字,而是字符串。这令人费解有两个原因。(1) 由于该time列具有 type decimal,因此它应该具有“数字”亲和力,这应该将存储在其中的任何看起来像数字的内容转换为数字。(2) 即使值存储为字符串,它们仍应转换为数字以与 0.0004 进行比较。

为什么他们没有归信呢?可能性#1:也许它们包含额外的空格或类似的东西。可能性#2:也许您的语言环境想要使用除.小数点之外的其他内容。(很可能还有其他我没有想到的可能性。)

如果您在表中插入一条实际上包含数字(insert into table_a (id,time) values (999,0.0001)或类似内容)的记录,该记录是否会包含在您的选择中?


Mik*_*erg 5

感谢您的所有建议,我找到了问题的根源:

“时间”列的值被视为“文本”。为什么?

我使用“ .import”将数据导入表中,并且我的CSV文件在十进制值周围包含空格。SQLite的import命令以某种方式即使类型不匹配也允许插入。从CSV文件中删除空格后,数据被插入为“实数”,从而可以正确进行数字比较。但是,它不能解释为什么“十进制”列中的数据是“真实”类型,而不是其文档中所述的“十进制”或“数字”类型:http : //www.sqlite.org/datatype3.html

select id, time, typeof(time) from table_a;
id    time           type
----  -------------  ----
0      0.000502      text
1      0.000745      text
2      0.000725      text
4      0.000197      text
5      0.000176      text
6      0.000833      text
7      0.000269      text
8      0.000307      text
9      0.000302      text

select id, time, typeof(time) from table_b;
id    time           type
----  -------------  ----
0     0.000502       real
1     0.000745       real
2     0.000725       real
4     0.000197       real
5     0.000176       real
6     0.000833       real
7     0.000269       real
8     0.000307       real
9     0.000302       real
Run Code Online (Sandbox Code Playgroud)