0

タイプが指定されていないこの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たとえば、それを定義すると、機能します。

4

1 に答える 1

1

これはおそらく次の理由によるものです:-

タイプが指定されていない場合、列のアフィニティーは NONE になります

この :-

アフィニティ NONE を持つ列は、あるストレージ クラスを別のストレージ クラスよりも優先せず、あるストレージ クラスから別のストレージ クラスにデータを強制する試みは行われません。

したがって、キャスト expr を試すことができます:-

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

未検証

于 2013-09-14T00:23:38.300 に答える