【问题标题】:Bitwise operation in SQL ServerSQL Server 中的按位运算
【发布时间】:2019-12-28 19:31:21
【问题描述】:

我有一列 CategoryId 将同时存储多个值,其中一些具有 1(BA)、2(SA)或 3(两者)。我不确定这是否正确。

例如,因为 3 包括 1 和 2,所以查询会导致所有记录。如果我想要具有 both 类别的行,那么按位将不起作用。我相信我混淆了术语。

样本数据和查询:

CREATE TABLE #Payment (Id INT, Name NVARCHAR(50), CategoryId INT)

INSERT #Payment (Id, Name, CategoryId) VALUES(1, N'A', 1) --BA
INSERT #Payment (Id, Name, CategoryId) VALUES(1, N'B', 2) --SA
INSERT #Payment (Id, Name, CategoryId) VALUES(1, N'C', 3) --BA and SA
INSERT #Payment (Id, Name, CategoryId) VALUES(1, N'D', 2) --SA

DECLARE @Value INT = 3

SELECT *
FROM #Payment
WHERE (CategoryId & @Value) = CategoryId

【问题讨论】:

  • 你还有什么问题?
  • 我需要在一种情况下获得只有这两个类别的,谢谢
  • 看我的回答。你有什么检查任何位,而不是全部。

标签: sql-server tsql operators bitwise-operators


【解决方案1】:

在 WHERE 子句中需要进行细微的更正。应该是:

WHERE (CategoryID & 3) =  3          -- bits 1 and 2 are set (matches 3, 7, 11, 15, ...)

为了完整起见,这里是其他变体:

WHERE (CategoryID & 3) <> 0          -- bits 1 or  2 are set (matches 1, 2, 3, 5, 6, 7, 9, 10, 11, ...)
WHERE (CategoryID & 3) =  0          -- bits 1 and 2 are not set (matches 0, 4, 8, 12, ...)
WHERE (CategoryID & 3) =  CategoryID -- bits other than 1 and 2 are not set (matches 0, 1, 2, 3)

【讨论】:

  • 这回答了这个问题,但对我来说,这似乎是 OP 的 X Y 问题。在一列中存储多个值似乎在这里没有任何好处,只会增加复杂性。我已经看到为此目的直接在整数列中使用基数 2 的解决方案,但它们似乎总是难以查询,并且会混淆来自必须支持系统的任何人的数据。无论如何,该解决方案有效,但 OP 应该考虑不同的 IMO。
  • 抱歉,Jacob,在这种情况下,您的建议是什么?
猜你喜欢
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
相关资源
最近更新 更多