我需要使用简单的选择来执行十进制比较操作,例如:
从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);
SQLite 有一个非正统的动态类型系统,其中列的类型并不决定列中实际数据的类型,它只是鼓励 SQLite 将数据转换为特定类型(如果可能的话)。
当尝试比较字符串和数字时,如果字符串不是格式正确的数字,则它被认为大于数字。
因此,一个明显的猜测是,由于某种原因,这些时间值实际上不是数字,而是字符串。这令人费解有两个原因。(1) 由于该time
列具有 type decimal
,因此它应该具有“数字”亲和力,这应该将存储在其中的任何看起来像数字的内容转换为数字。(2) 即使值存储为字符串,它们仍应转换为数字以与 0.0004 进行比较。
为什么他们没有归信呢?可能性#1:也许它们包含额外的空格或类似的东西。可能性#2:也许您的语言环境想要使用除.
小数点之外的其他内容。(很可能还有其他我没有想到的可能性。)
如果您在表中插入一条实际上包含数字(insert into table_a (id,time) values (999,0.0001)
或类似内容)的记录,该记录是否会包含在您的选择中?
感谢您的所有建议,我找到了问题的根源:
“时间”列的值被视为“文本”。为什么?
我使用“ .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)
归档时间: |
|
查看次数: |
9909 次 |
最近记录: |