Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

So sánh hai mặt nạ bit trong SQL để xem có bit nào khớp không

Câu trả lời cho câu hỏi của bạn là sử dụng Bitwise & như thế này:

SELECT * FROM UserTable WHERE Roles & 6 != 0

6 có thể được trao đổi cho bất kỳ sự kết hợp nào của trường bit của bạn mà bạn muốn kiểm tra xem bất kỳ người dùng nào cũng có một hoặc nhiều bit đó. Khi cố gắng xác thực điều này, tôi thường thấy hữu ích khi viết nó ra lâu trong hệ nhị phân. Bảng người dùng của bạn trông giống như sau:

        1   2   4
------------------
Dave    0   1   1
Charlie 0   1   0
Susan   0   0   1   
Nick    1   0   0

Bài kiểm tra của bạn (6) là cái này

        1   2   4
------------------
Test    0   1   1

Nếu chúng ta xem xét từng người thực hiện bitwaise và chống lại bài kiểm tra, chúng ta nhận được những điều này:

        1   2   4
------------------
Dave    0   1   1   
Test    0   1   1
Result  0   1   1 (6)

Charlie 0   1   0
Test    0   1   1
Result  0   1   0 (2)

Susan   0   0   1
Test    0   1   1
Result  0   0   1 (4)

Nick    1   0   0
Test    0   1   1
Result  0   0   0 (0) 

Phần trên sẽ chứng minh rằng bất kỳ bản ghi nào mà kết quả không phải là 0 đều có một hoặc nhiều cờ được yêu cầu.

Chỉnh sửa:Đây là trường hợp kiểm tra mà bạn muốn kiểm tra điều này

with test (id, username, roles)
AS
(
    SELECT 1,'Dave',6
    UNION SELECT 2,'Charlie',2
    UNION SELECT 3,'Susan',4
    UNION SELECT 4,'Nick',1
)
select * from test where (roles & 6) != 0  // returns dave, charlie & susan

hoặc

select * from test where (roles & 2) != 0 // returns Dave & Charlie

hoặc

select * from test where (roles & 7) != 0 // returns dave, charlie, susan & nick


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ví dụ về Chuyển đổi "date" thành "datetimeoffset" trong SQL Server (T-SQL)

  2. Chuyển đổi ngầm định và làm tròn

  3. Cách khắc phục “Tên tương quan phải được chỉ định cho tập hợp hàng loạt trong mệnh đề from.” trong SQL Server

  4. Sao lưu cấp bảng

  5. Làm cách nào để nhận số lượng hàng từ EXEC () trong TSQL SPROC?