복붙노트

[SQL] 비트 중 하나가 일치하는 경우 SQL에 두 개의 비트 마스크를 비교하는 것은 볼 수

SQL

비트 중 하나가 일치하는 경우 SQL에 두 개의 비트 마스크를 비교하는 것은 볼 수

비트의 일치 있는지 확인하기 위해 거래-SQL에 두 개의 비트 마스크를 비교하는 방법이 있나요? 나는 사용자가 속한 역할 모두를위한 비트 마스크와 사용자 테이블을 가지고, 나는 제공된 비트 마스크의 역할 중 하나를 가지고있는 모든 사용자를 선택하고 싶습니다. 그래서 아래의 데이터를 사용하여 역할 데이브, 찰리와 수잔,하지만 닉을 선택해야 6 (디자이너 + 프로그래머)의 비트 마스크.

User Table
----------
ID  Username  Roles
1   Dave      6
2   Charlie   2
3   Susan     4
4   Nick      1

Roles Table
-----------
ID  Role
1   Admin
2   Programmer
4   Designer

어떤 아이디어? 감사.

해결법

  1. ==============================

    1.귀하의 질문에 대한 대답은 비트 단위 및 같은를 사용하는 것입니다 :

    귀하의 질문에 대한 대답은 비트 단위 및 같은를 사용하는 것입니다 :

    SELECT * FROM UserTable WHERE Roles & 6 != 0
    

    6는 어떤 사용자가 하나 또는 그 비트 이상을 가지고 있는지 확인하려는 비트 필드의 조합으로 교환 할 수있다. 이 유효성을 검사하려고 할 때 나는 보통 도움이 바이너리에서이 아웃 긴 형식을 작성 찾을 수 있습니다. 귀하의 사용자 테이블은 다음과 같다 :

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

    테스트 (6)이있다

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

    우리가 테스트 비트 단위를하고 각 사람을 통해 그리고에 가면 우리는이를 얻을 :

            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) 
    

    위의 결과가 0이 아닌 모든 레코드가 하나있다 이상의 요청 플래그 것을 증명해야한다.

    편집 : 여기에 테스트 케이스는 당신이 확인하고자한다입니다

    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
    

    또는

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

    또는

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

    2.은 Transact-SQL의 비트 AND 연산자를 "&"를 사용하여 0으로 결과를 비교합니다. 더 나은 대신 정수 컬럼의 비트로서 역할을 코딩의, 부울 열, 각 역할에 대한 하나를 사용하십시오. 그런 다음 쿼리는 단순히 디자이너가 될 친절한 프로그래머 것이다. 이 역할은 응용 프로그램의 수명 기간 동안 많은 변화를 기대한다면, 사용자와 역할 사이의 관계를 매핑하는 다 대다 테이블을 사용합니다. 두 대안은 비트 단위 AND 연산자의 존재에 의존하는보다 더 휴대용이다.

    은 Transact-SQL의 비트 AND 연산자를 "&"를 사용하여 0으로 결과를 비교합니다. 더 나은 대신 정수 컬럼의 비트로서 역할을 코딩의, 부울 열, 각 역할에 대한 하나를 사용하십시오. 그런 다음 쿼리는 단순히 디자이너가 될 친절한 프로그래머 것이다. 이 역할은 응용 프로그램의 수명 기간 동안 많은 변화를 기대한다면, 사용자와 역할 사이의 관계를 매핑하는 다 대다 테이블을 사용합니다. 두 대안은 비트 단위 AND 연산자의 존재에 의존하는보다 더 휴대용이다.

  3. ==============================

    3.

    SELECT * FROM UserTable WHERE Roles & 6 > 0
    
  4. ==============================

    4.WHERE MASK1 및 mask2> 0 테이블 SELECT *

    WHERE MASK1 및 mask2> 0 테이블 SELECT *

  5. ==============================

    5.예:

    예:

    DECLARE @Mask int
    SET @Mask = 6
    
    DECLARE @Users TABLE
    (
    ID int,
    Username varchar(50),
    Roles int
    )
    
    INSERT INTO @Users (ID, Username, Roles) 
    SELECT 1, 'Dave', 6
    UNION
    SELECT 2, 'Charlie', 2
    UNION
    SELECT 3, 'Susan', 4
    UNION
    SELECT 4, 'Nick', 1
    
    SELECT * FROM @Users WHERE Roles & @Mask > 0
    
  6. ==============================

    6.찾으려면 모든 프로그래머는 사용

    찾으려면 모든 프로그래머는 사용

    SELECT * FROM UserTable WHERE Roles & 2 = 2
    
  7. from https://stackoverflow.com/questions/143712/comparing-two-bitmasks-in-sql-to-see-if-any-of-the-bits-match by cc-by-sa and MIT license