SQLite: числовые значения в CSV рассматриваются как текст? - PullRequest
1 голос
/ 01 июля 2011

Я просто импортировал огромный текстовый файл в таблицу, используя команду .import. Все в порядке, за исключением того факта, что кажется, что числовые значения воспринимаются как текст. Например, такие условия, как WHERE field > 4, всегда выполняются. Я не указывал типы данных при создании таблицы, но это не имеет значения при создании небольших таблиц.

Любой совет будет приветствоваться. Спасибо!

Редактировать / заключить: оказывается, некоторые значения в моем CSV-файле были пустыми. В итоге я решил эту проблему, став немного менее ленивым и явно объявляя типы данных.

1 Ответ

3 голосов
/ 01 июля 2011

Способ обработки типов SQLite описан на этой странице: http://www.sqlite.org/datatype3.html

В частности:

При обстоятельствах, описанных ниже, ядро базы данных может преобразовывать значения между числовыми классами хранения (INTEGER и REAL) и ТЕКСТ во время выполнение запроса.

Раздел 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)" имеет сходство это то же самое, что столбец с объявленный тип "type".
  • В противном случае выражение имеет NONE affinity.

Вот еще один пример:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...