TSQL 中的按位运算

Aka*_*ash 1 t-sql

取以下代码:

Declare @a integer
set @a = 0
set @a = @a | cast (1 as BINARy)
set @a = @a | cast (100 as BINARy)
select cast (@a as integer)
Run Code Online (Sandbox Code Playgroud)

现在,这段代码的输出不应该是 5 吗?

我有一个整数,将它设置为 0,所以在二进制中它全是 0

然后我OR用 1 ,所以它变成 0..001

然后我OR用 100 二进制,所以它应该变成 00..0101,十进制是 5

我实际得到的输出是 101

编辑:为了更清楚,我试图用 TSQL 完成以下代码在 C++ 中的作用

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int a;
a = 0;
a = a | 1;
cout<< a;
a = a | 0b100;
cout<<endl<<a;
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*sel 6

你的演员没有做你认为应该做的事。

select cast(cast(100 as binary) as int)等于 100。换句话说,您将十进制值 100 转换为二进制值,而不是采用基数为 2 的表示法中的“100”。

你的期望实际上是这样的:

Declare @a integer
set @a = 0
set @a = @a | cast (1 as BINARY)
set @a = @a | cast (5 as BINARY)
select cast (@a as integer)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果这是新开发,我强烈建议不要在 SQL Server 中进行位移。它很慢,难以维护,并且违反了第一范式。如果不是,我猜你可能已经知道了……

要将二进制转换为十进制,您可以创建一个函数。还有其他方法可以从 integer 到 display base-2 notation,但这感觉会很慢。

  • 完全没有,特别是考虑到索引在查询中的作用。如果您对属性进行按位运算,则搜索该整数值具有属性“标志”设置的所有记录需要扫描整个表并对每一行执行相当昂贵的操作。将其分解为单独的属性,您可以在适当的列上放置索引,将所需的扫描 + 功能转换为没有功能的搜索。优化 C 和优化 T-SQL 是两个截然不同的概念,重叠相对较少。 (4认同)