Операторы SQLite не работают с одиночными числами di git - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть базовая c таблица SQlite, настроенная для регистрации сообщений MQTT. Полезная нагрузка содержит диапазон входных данных (int, float, string) в зависимости от сообщения topi c.

CREATE TABLE mosquitto(
    TIMESTAMP INT NOT NULL, 
    DATE TEXT NOT NULL, 
    PAYLOAD TEXT NOT NULL, 
    TOPIC TEXT NOT NULL
)

Если я пытаюсь найти в базе данных значения, например

SELECT * FROM mosquitto WHERE topic = 'Temperature' AND payload <= 2;

это не работает.

Если я создаю двойное число di git, добавляя, скажем, 10, оно делает

SELECT * FROM mosquitto WHERE topic = 'Temperature' AND payload +10 <= 12;

Этот текст сортируется по алфавиту, как в JavaScript?

Есть ли более элегантный способ сделать это?

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 13 апреля 2020

Ваш столбец имеет тип данных TEXT, поэтому при сравнении используются другие правила, чем при работе с числами. Например, для строки '10' меньше, чем '2', поскольку первая начинается с '1', а вторая - '2 '.

При добавлении числа в строку SQLite неявно преобразует текст в число - это именно то, что вы намереваетесь.

Вы можете просто добавить 0, поэтому вам не нужно менять значение справа:

SELECT * FROM mosquitto WHERE topic = 'Temperature' AND payload + 0 <= 2;

Или вы можете явным образом cast() ввести текст в число, что могло бы как-то прояснить намерение:

SELECT * FROM mosquitto WHERE topic = 'Temperature' AND cast(payload as int) <= 2;

Окончательным решением будет исправить вашу модель данных, поэтому каждый отдельный атрибут полезной нагрузки хранится в другом столбце с правильным типом данных - в зависимости от вашего варианта использования это может быть или не быть возможным.

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