Сталкивающиеся проблемы с побитовой операцией AND
Я использую базу данных SQl
У меня есть одна таблица с типом столбца Blob.
for e.g:
create table Alarm(
id int,
xyz blob
);
это мои вставки заявления:
INSERT INTO Значения тревоги (2, "1000001");
INSERT INTO Значения тревоги (5, "0001000");
INSERT INTO Значения тревоги (7, "0110110");
это мое утверждение SELECT
SELECT * из Alarm, где xyz & cast("1001001" в виде BLOB-объекта);
Когда я использую побитовую операцию И он возвращает все записи из таблицы. Но в этом сценарии записи 1 и 2 должны быть выбраны.
оператор select возвращает все записи, что неверно.
пожалуйста, помогите мне.
1 ответ
Вы не можете делать то, что хотите, то есть хранить строки /BLOB, представляющие двоичное значение числа, и выполнять над ними арифметические или логические операции. SQLite не имеет встроенного метода для интерпретации двоично-цифровых строк.
Однако, если ваши двоичные представления длиннее 64-битных, вы можете просто сохранить значения как обычные числа, как показано в следующей записи:
SQLite version 3.8.4.1 2014-03-11 15:27:36
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .read so.sql3
create table Alarm(
id integer,
xyz integer
);
insert into Alarm values
( 1, 65 ), -- 0x41 == 00100001
( 2, 8 ), -- 0x08 == 00001000
( 3, 54 ) -- 0x36 == 00110110
;
select * from Alarm where
xyz & 73 -- 0x49 == 01001001
;
1|65
2|8
Очевидно, что если ваши "числа" поступают в виде двоичных представлений или результаты должны быть представлены в таком формате, вам нужно будет выполнить соответствующие преобразования с любой стороны операторов SQL. Я полагаю, что чуть более поздняя версия SQLite примет 0x41
запись, позволяющая указывать числа в шестнадцатеричном виде напрямую.
Единственный другой вариант, о котором я могу подумать, - это определить собственную пользовательскую функцию (см. " Создание или переопределение функций SQL" в документации по SQLite3), чтобы выполнить преобразование двоичной строки в целое. Однако у меня нет такого опыта, и если нет веских причин для хранения двоичного представления в виде строк, это, вероятно, излишне.