Сталкивающиеся проблемы с побитовой операцией 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), чтобы выполнить преобразование двоичной строки в целое. Однако у меня нет такого опыта, и если нет веских причин для хранения двоичного представления в виде строк, это, вероятно, излишне.

Другие вопросы по тегам