如何为不同的数据类型创建SQLite索引

如何为不同的数据类型创建SQLite索引,sqlite,Sqlite,当我在某个列上创建索引时,索引是数据类型识别的,但是我可以在任何列中存储任何类型的数据,但是如果我想使用不同的比较规则(例如,将数字作为数字而不是字符串进行比较)来比较列内容,则索引有些无用 例如: sqlite> create table foo (key varchar, value varchar); sqlite> create index foo_ndx on foo (key, value); sqlite> insert into foo values ('bar

当我在某个列上创建索引时,索引是数据类型识别的,但是我可以在任何列中存储任何类型的数据,但是如果我想使用不同的比较规则(例如,将数字作为数字而不是字符串进行比较)来比较列内容,则索引有些无用

例如:

sqlite> create table foo (key varchar, value varchar);
sqlite> create index foo_ndx on foo (key, value);
sqlite> insert into foo values ('bar', 10);

sqlite> select * from foo where key = 'bar' and value > 9.0;
sqlite> explain query plan select * from foo where key = 'bar' and value > 9.0;
0|0|0|SEARCH TABLE foo USING COVERING INDEX foo_ndx (key=? AND value>?) (~2 rows)
在这种情况下,
9.0
被隐式转换为
varchar
,两个
varchar
被比较,索引被完全使用,但无法找到记录

sqlite> select * from foo where key = 'bar' and CAST(value AS REAL) > 9.0;
bar|10
sqlite> explain query plan select * from foo where key = 'bar'
   ...> and CAST(value AS REAL) > 9.0;
0|0|0|SEARCH TABLE foo USING COVERING INDEX foo_ndx (key=?) (~5 rows)
在本例中,我显式地将
value
转换为
real
,并对两个
real
进行比较,sqlite查找记录,但索引仅部分使用

这是可以理解的行为,但是我是否可以在
foo
表上创建一个将列
value
视为真实的索引?我尝试在
CREATE INDEX
中使用
CAST
,但出现语法错误,我可以使用
CAST
foo
表上创建视图,但无法在视图上创建索引

索引不支持数据类型

默认情况下,
value
列中的值视为文本(如果可能),因为该列包含文本。 使用索引不会改变这种行为


如果不希望将数字视为文本,请不要将列声明为
varchar
。(注意:您可以在不使用任何数据类型的情况下声明列。)

似乎定义不使用类型的列就可以做到这一点,在没有禁用索引的
cast
的情况下,比较可以正常工作。如果没有数据类型的所有测试都能正常工作,我会再检查一下,并接受您的答案。默认关联仍然是文本,但当我使用
CAST
时,sqlite会将列值作为数字进行比较,并完全使用索引,这正是我所需要的。非常感谢。