Нечетное поведение sqlite3 для предложения WHERE в столбце TEXT - PullRequest
1 голос
/ 02 октября 2019

Итак, у меня есть таблица.

sqlite> .schema
CREATE TABLE data(date int primary key, temp text, humi text, co2 text, coarse int);

У него есть некоторые данные, и использование условия WHERE для столбца TEXT делает то, что я ожидал:

sqlite> SELECT * FROM data WHERE temp > 26;
date        temp        humi        co2         coarse
----------  ----------  ----------  ----------  ----------
1569962962  26.01       30.97       530.34      1
1569963029  26.05       30.91       528.57      0
1569963097  26.05       30.87       530.16      0
1569963164  26.09       30.83       530.37      1
1569963232  26.09       30.84       530.75      0
1569963300  26.13       30.77       532.51      0

Это также делает то, что я ожидаю, когда задаю условие, что ни одна из строк не совпадает:

sqlite> select * from data where temp > 99;
sqlite>

Если я не использую 100 или 1000 и т. Д. Затем игнорируется WHERE идает мне каждую строку:

sqlite> select * from data where temp > 100;
date        temp        humi        co2         coarse
----------  ----------  ----------  ----------  ----------
1569967795  25.99       31.65       558.03      1
1569967863  26.01       31.60       558.78      0
1569967930  26.02       31.64       557.77      0
1569967998  26.01       31.65       556.68      1
1569968067  26.02       31.63       557.31      0
1569968134  26.04       31.64       560.01      0
1569968201  26.08       31.66       559.84      1
1569968268  26.05       31.66       563.95      0
1569968335  26.08       31.70       562.86      0
1569968403  26.09       31.69       563.85      1
1569968471  26.09       31.73       565.58      0
1569968539  26.11       31.69       566.04      0
1569968607  26.13       31.69       564.95      1
1569968674  26.13       31.62       565.51      0
1569968742  26.16       31.63       567.40      0
1569968810  26.16       31.60       568.38      1
[snip]

Я, конечно, обнаружил это, выполнив операцию DELETE с предложением WHERE, чтобы удалить некоторые неверные данные. Все нормально, я больше не плачу. (Исторические данные датчика были не важны) Но почему поведение на кратных 10? Я предполагаю, что он делает что-то слишком умное с гибкой печатью, но я не вижу, где.

1 Ответ

4 голосов
/ 02 октября 2019

Это потому, что вы проводите текстовое сравнение (из-за того, что temp имеет сходство со столбцом TEXT), поэтому значение 1 меньше 200 (т. Е. Символ 1 меньше значения 2, поэтому остальные символы незначительны).

Вам необходимо провести числовое сравнение, и это можно сделать с помощью CAST ing, например

SELECT * FROM data WHERE CAST(temp AS REAL) > 99;

или

SELECT * FROM data WHERE temp > CAST(99 AS REAL);

Возможно, вы захотите взглянутьв CAST выражениях

Если тип столбца temp был РЕАЛЬНЫМ согласно

CREATE TABLE data(date int primary key, temp REAL /*<<<<<<<<<< CHANGED */, humi text, co2 text, coarse int);` 

, то CAST не требуется.

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