我只是使用.import命令将一个巨大的文本文件导入到表中。一切都很好,除了它似乎将数值清楚地视为文本。例如,始终满足WHERE field > 4
等条件。我在创建表时没有指定数据类型,但是在创建小表时这似乎并不重要。
欢迎任何建议。谢谢!
编辑/结论:事实证明我的CSV文件中的一些值是空白的。我最后通过稍微懒惰并明确声明数据类型来解决这个问题。
答案 0 :(得分:3)
此页面描述了SQLite处理类型的方式:http://www.sqlite.org/datatype3.html
特别是:
在下述情况下, 数据库引擎可以转换值 数字存储类之间 (INTEGER和REAL)和TEXT期间 查询执行。
第3.4节(比较示例)应该给出具体的例子,这些例子很可能解释你所遇到的问题。这可能是这个例子:
-- Because column "a" has text affinity, numeric values on the -- right-hand side of the comparisons are converted to text before -- the comparison occurs. SELECT a < 40, a < 60, a < 600 FROM t1; 0|1|1
为避免猜测亲和力,您可以明确使用CAST
(参见第3.2节):
SQLite可能会尝试转换值 存储类INTEGER之间, 执行之前的REAL和/或TEXT 比较。是否有 在此之前尝试转换 比较发生取决于 操作数的亲和力。操作数 亲和力取决于 遵循规则:
- 作为列值的简单引用的表达式具有 与列具有相同的亲和力。注意 如果X和Y.Z是列名,那么+ X. 和+ Y.Z被认为是表达式 为了确定 亲和力。
- “CAST(expr AS type)”形式的表达具有亲和力 这与带有a的列相同 声明的类型“类型”。
- 否则,表达式具有NONE亲和力。
这是另一个例子:
CREATE TABLE test (value TEXT);
INSERT INTO test VALUES(2);
INSERT INTO test VALUES(123);
INSERT INTO test VALUES(500);
SELECT value, value < 4 FROM test;
2|1
123|1
500|0
CSV导入可能会创建亲缘关系TEXT
的列。