SQLite:CSV中的数字值被视为文本?

时间:2011-06-30 20:32:03

标签: sqlite

我只是使用.import命令将一个巨大的文本文件导入到表中。一切都很好,除了它似乎将数值清楚地视为文本。例如,始终满足WHERE field > 4等条件。我在创建表时没有指定数据类型,但是在创建小表时这似乎并不重要。

欢迎任何建议。谢谢!

编辑/结论:事实证明我的CSV文件中的一些值是空白的。我最后通过稍微懒惰并明确声明数据类型来解决这个问题。

1 个答案:

答案 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的列。