为什么SQLite将数字视为字符串?

时间:2013-09-13 23:59:32

标签: sqlite

我有这个DB,其类型未指定但内容都是数字。 SQLite将它们视为字符串,我希望它将它们视为数字。是否可以在不更改SQLite定义的情况下执行此操作?此外,我看到其他人抱怨SQLite将他们的字符串视为数字...为什么它会为他们这样做,为什么不这样做呢?见下文:

sqlite> .sche
CREATE TABLE cpu (timeid primary key, idle, myproc);
sqlite> select myproc, count(*) from cpu group by myproc;
myproc        count(*)
----------  ----------
0           1528
1           3
10          496
11          1293
12          688
13          2
15          1
2           42
3           71
4           54
5           38
6           108
7           186
8           384
9           315
sqlite> select max(myproc) from cpu;
max(myproc)
----------
9
sqlite> select sum(myproc), avg(myproc), count(*) from cpu;
sum(myproc)   avg(myproc)         count(*)
----------  ----------------  ----------
36043       6.91937032059896  5209
sqlite> select sum(myproc), avg(myproc), count(*) from cpu where fmon > 0;
sum(myproc)   avg(myproc)         count(*)
----------  ----------------  ----------
36043       6.91937032059896  5209
sqlite> select sum(myproc), avg(myproc), count(*) from cpu where fmon != 0;
sum(myproc)   avg(myproc)         count(*)
----------  ----------------  ----------
36043       6.91937032059896  5209
sqlite> select sum(myproc), avg(myproc), count(*) from cpu where fmon != "0";
sum(myproc)   avg(myproc)         count(*)
----------  ----------------  ----------
36043       9.79163270850312  3681

所以,正如你所看到的,max()并没有返回最大的数字,而是最大的字符串。当我尝试使用where子句过滤掉一些行时,它只有在我将列'myproc'与字符串“0”进行比较时才会有效,永远不会与数字0(零)进行比较。并且,正如我所说,“myproc”没有定义任何类型。例如,如果我将其定义为float,则可以正常工作。

1 个答案:

答案 0 :(得分:1)

这可能是因为: -

  

如果未指定类型,则该列具有亲和力NONE

和这: -

  

具有亲缘关系NONE的列不喜欢一个存储类而不是另一个存储类,并且不会尝试将数据从一个存储类强制转换为另一个存储类。

所以你可以尝试一个强制转换expr: -

select max(cast(myproc AS INTEGER)) from cpu

未经过测试