【问题标题】:facing issues with bitwise AND operation面临按位与运算的问题
【发布时间】:2018-04-03 18:06:15
【问题描述】:

我正在使用 SQl 数据库

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

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

这是我的插入语句:

插入警报值(2, '1000001');

INSERT INTO 警报值(5, '0001000');

INSERT INTO 警报值(7, '0110110');

这是我的 SELECT 语句

SELECT * from Alarm where xyz & cast('1001001' as blob);

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

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

请帮帮我。

【问题讨论】:

  • 我不知道你是否可以用 BLOB 做你正在尝试的事情,但是......你记得将 1001001 标记为二进制常量吗?如上所用,它将被视为十进制的 1,001,001;如果进行按位与,匹配所有记录的二进制扩展。
  • select * from Alarm where Alarm.bt_str & cast(1001001 as Binary);我已经尝试过了,但它仍然返回所有记录。请帮帮我
  • 1001001 仍将被视为十进制数(一百万、一千零一)。此外,B'0001000' 在我所知道的 SQLite 中没有任何意义,因此请编辑您正在使用的实际 INSERTSELECT 语句的问题示例。
  • 我已对我的问题进行了更改。我可以使用 Blob 数据类型来存储按位字符串,以便我可以在其中执行按位 AND 运算符吗?
  • 那些不是 blob。编辑您正在使用的实际 INSERT 和 SELECT 语句的问题示例。

标签: sql sqlite blob bitwise-and


【解决方案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 表示法,以允许直接以十六进制指定数字。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    相关资源
    最近更新 更多