面对按位AND操作的问题

时间:2017-10-23 08:44:33

标签: sql sqlite blob bitwise-and

我正在使用SQl数据库

我有一个表的列数据类型为Blob。

for e.g:
create table Alarm(
id int,
xyz blob
);

这是我的插入声明:

INSERT INTO警报值(2,' 1000001');

插入警报值(5,' 0001000');

插入警报值(7,' 0110110');

这是我的SELECT语句

SELECT * from Alarm其中xyz&演员(' 1001001'作为blob);

当我使用按位AND 操作时,它会返回表中的所有记录。 但在这种情况下记录1&应该选择2。

select 语句返回所有错误的记录。

请帮帮我。

1 个答案:

答案 0 :(得分:0)

你不能做你想要的,也就是说,存储表示数字二进制值的字符串/ 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表示法,以允许数字直接以十六进制指定。

我能想到的唯一其他选择是定义自己的用户定义函数(参见SQLite3文档中的Create Or Redefine SQL Functions),以执行 binary-string-to -integer 转换。但是,我没有这方面的经验,除非有一个非常令人信服的理由将二进制表示存储为字符串,否则它可能有点过分。