Sql-Server

如何將作為按位或的最終結果的整數轉換為按位或應用於單個整數的表?

  • November 27, 2019

如何將按位 OR 的最終整數轉換回應用按位 OR 運算的原始整數集?

例如,如果我有以下一組位值:{0, 1, 2, 4, 8, 16} 並且如果我有按位 OR 生成的值 11,那麼我想將該值 11 轉換回 1, 2 和 8(唯一可能的值組合)。

JD 提供的答案有效,但在範例中,結果中不包含值 1,即使 11 的正確位是 1、2、8。

下面的範例擴展了該答案的邏輯,但使用遞歸 CTE 而不是循環來生成位值並將其包裝在一個函式中,該函式可以輕鬆呼叫以返回給定遮罩的位表。它也不使用表來儲存位值並即時生成它們。

程式碼:

CREATE FUNCTION fnGetBitsForMask (@Mask INT)
RETURNS TABLE
AS
RETURN
   WITH BitwiseValues AS
   (
       SELECT CAST(1 AS INT) AS RowNumber, CAST(0 AS INT)  AS BitValue
       UNION ALL
       SELECT b1.RowNumber+1 AS RowNumber, POWER(2, b1.RowNumber-1) AS BitValue
       FROM BitwiseValues b1
       WHERE b1.RowNumber < 30
   )
   SELECT b.BitValue
   FROM BitwiseValues b
   CROSS JOIN (SELECT @Mask AS Mask) m
   WHERE b.BitValue & m.Mask > 0

正在使用:

SELECT * FROM dbo.fnGetBitsForMask(11)

結果:

BitValue
1
2
8

作為表值函式,您可以在 SELECT 語句和其他查詢中使用它,而無需維護表或使用循環。

引用自:https://dba.stackexchange.com/questions/254190