我有这个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
,则可以正常工作。
答案 0 :(得分:1)
这可能是因为: -
如果未指定类型,则该列具有亲和力NONE
和这: -
具有亲缘关系NONE的列不喜欢一个存储类而不是另一个存储类,并且不会尝试将数据从一个存储类强制转换为另一个存储类。
所以你可以尝试一个强制转换expr: -
select max(cast(myproc AS INTEGER)) from cpu
未经过测试