这个 sql where 子句中的“&”是啥意思?
Posted
技术标签:
【中文标题】这个 sql where 子句中的“&”是啥意思?【英文标题】:What does "&" means in this sql where clause?这个 sql where 子句中的“&”是什么意思? 【发布时间】:2021-11-16 16:52:10 【问题描述】:这里的“&”是什么意思:
select pt.TrTp, sum(pt.TrTp)
from ProdTr pt
where TransSt & 16 <> 16 // this is the row that i don´t understand..
group by pt.TrTp
【问题讨论】:
这是一个按位与。更多信息:msdn.microsoft.com/en-us/library/ms174965.aspx 【参考方案1】:它被称为位掩码。它用于数字中的各个位具有不同含义的情况,而不是仅表示数字本身的数字(例如,如果您将年龄保存到数据库中)。
当您想像任何二进制形式的数字并想要测试该数字中的某个位是否已设置时,您可以使用二进制 AND 运算符与您要测试的数字和位一起进行测试,如下所示:
if (number & 16 == 16)
在二进制中,这意味着以下(假设您的数字是 25):
if (00011001 & 00010000 == 00010000)
在这里你可以看到,第 5 位的数字(从下往上数)都是 1,因此得到的数字在该位有 1。由于没有其他 1,因此当两个数字在该位置都为 1 时,结果数字就是 16。
我想补充一点:将不同的含义编码到一个数据库字段中通常是一种不好的做法。很难通过索引进行索引和检索,并且根据您的 DBMS 甚至可能完全没有索引。
【讨论】:
好的,但是这个 where 子句不能用任何“更简单”的形式重写吗? 不适用于给定的数据库结构。有人决定(s)他想将信息编码成数字内的单个位。除非将单个数字信息划分为列,即重构数据库,否则您无法解决这个问题。我强烈建议这样做,因为现代 DMBS 在优化方面比现在大多数人要好得多。 @0xCAFEBABE 我真的会对任何关于该主题的论文或类似的文章都非常感兴趣,这些论文可以解释为什么位掩码(在这种情况下,状态位掩码不需要您在添加status-type) 不再值得。你会用什么代替? 我的情况是“TransSt”总是有一个从 0 到 15 的整数,那么这不会总是错误的吗? @J.Steen 这是一个复杂的话题,它高度依赖于如何读取标志数/字节/长。如果您确保它永远不会作为查询的一部分读取并且仅用作记录本身的一部分,那么它应该不是问题。但是,永远无法为单个位值建立索引,因此使用位操作查询该值将强制 DMBS 对匹配所有其他条件的所有行完成位操作,甚至可能完全阻止它使用索引。我还没有对此进行过广泛的测试,我也会对一些 EXPLAIN 结构感兴趣。【参考方案2】:这是按位AND
。它只是检查 value 中的第 4 位是否未设置。
我会将这个表达式改写为TransSt & 16 = 0
【讨论】:
【参考方案3】:这是一个按位与。
& 位运算符在两个表达式之间执行按位逻辑与,取两个表达式的每个对应位。当且仅当输入表达式中的两个位(对于正在解析的当前位)的值都为 1 时,结果中的位被设置为 1;否则,结果中的位设置为 0。
来自http://msdn.microsoft.com/en-us/library/ms174965.aspx
在这种情况下,它与标志一起使用,其中多个值存储在一个字段中,然后按位与运算用于检查特定状态 - 或者在这种 特定 情况下 - 检查字段不包含指定的状态。
【讨论】:
【参考方案4】:它是按位与。请参考这个MSDN Article。
【讨论】:
【参考方案5】:这是一个按位与运算符。
按位运算在一个或多个位模式或二进制数字的各个位级别上进行操作。它是处理器直接支持的快速、原始的操作,用于操作值以进行比较和计算。在简单的低成本处理器上,按位运算通常比除法快得多,比乘法快几倍,有时比加法快得多。虽然现代处理器由于其较长的指令流水线和其他架构设计选择,通常执行加法和乘法运算的速度与按位运算一样快,但由于资源使用减少,按位运算通常使用较少的功率/性能。
来自http://en.wikipedia.org/wiki/Bitwise_operation
【讨论】:
以上是关于这个 sql where 子句中的“&”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:IF .. ELSE 中的 Where 子句
oracle 形式:pl/sql 中 where 子句中的 max 子句