programing

SQL의 두 비트 마스크를 비교하여 일치하는 비트가 있는지 확인

megabox 2023. 9. 1. 20:43
반응형

SQL의 두 비트 마스크를 비교하여 일치하는 비트가 있는지 확인

Transact-SQL에서 두 개의 비트 마스크를 비교하여 일치하는 비트가 있는지 확인할 수 있는 방법이 있습니까?사용자가 속한 모든 역할에 대한 비트 마스크가 있는 사용자 테이블이 있으며 제공된 비트 마스크에서 역할이 있는 모든 사용자를 선택합니다.따라서 아래 데이터를 사용하여 역할 비트마스크 6(디자이너+프로그래머)은 Dave, Charlie 및 Susan을 선택해야 하지만 Nick은 선택하지 않아야 합니다.

사용자 테이블----------ID 사용자 이름 역할1 데이브 62 찰리 23 수잔 44 닉 1
역할 표-----------ID 역할관리자 1명2 프로그래머4 디자이너

아이디어 있어요?감사해요.

당신의 질문에 대한 답은 비트와이즈를 사용하는 것입니다.&다음과 같이:

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

Transact-SQL 비트 단위 AND 연산자 "&"을 사용하여 결과를 0과 비교합니다.또한 역할을 정수 열의 비트로 코딩하는 대신 각 역할에 대해 하나씩 부울 열을 사용합니다.그러면 당신의 질문은 디자이너와 프로그래머 친화적일 것입니다.응용 프로그램의 수명 동안 역할이 많이 변경될 것으로 예상되는 경우 다대다 테이블을 사용하여 사용자와 역할 간의 연결을 매핑합니다. 두 가지 방법 모두 비트 AND 연산자의 존재에 의존하는 것보다 더 휴대성이 높습니다.

SELECT * FROM UserTable WHERE Roles & 6 > 0

선택 * 마스크1 & 마스크2 > 0

예:

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

모든 프로그래머를 찾으려면 다음을 사용합니다.

SELECT * FROM UserTable WHERE Roles & 2 = 2

언급URL : https://stackoverflow.com/questions/143712/comparing-two-bitmasks-in-sql-to-see-if-any-of-the-bits-match

반응형