0

我有这个没有指定类型但内容都是数字的数据库。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为例如,它可以工作。

4

1 回答 1

1

这可能是因为:-

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

和这个 :-

具有关联性 NONE 的列不会优先选择一个存储类而不是另一个存储类,并且不会尝试将数据从一个存储类强制转换到另一个存储类。

所以你可以试试 cast expr :-

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

未测试

于 2013-09-14T00:23:38.300 回答