[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.귀하의 질문에 대한 대답은 비트 단위 및 같은를 사용하는 것입니다 :
귀하의 질문에 대한 대답은 비트 단위 및 같은를 사용하는 것입니다 :
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.은 Transact-SQL의 비트 AND 연산자를 "&"를 사용하여 0으로 결과를 비교합니다. 더 나은 대신 정수 컬럼의 비트로서 역할을 코딩의, 부울 열, 각 역할에 대한 하나를 사용하십시오. 그런 다음 쿼리는 단순히 디자이너가 될 친절한 프로그래머 것이다. 이 역할은 응용 프로그램의 수명 기간 동안 많은 변화를 기대한다면, 사용자와 역할 사이의 관계를 매핑하는 다 대다 테이블을 사용합니다. 두 대안은 비트 단위 AND 연산자의 존재에 의존하는보다 더 휴대용이다.
은 Transact-SQL의 비트 AND 연산자를 "&"를 사용하여 0으로 결과를 비교합니다. 더 나은 대신 정수 컬럼의 비트로서 역할을 코딩의, 부울 열, 각 역할에 대한 하나를 사용하십시오. 그런 다음 쿼리는 단순히 디자이너가 될 친절한 프로그래머 것이다. 이 역할은 응용 프로그램의 수명 기간 동안 많은 변화를 기대한다면, 사용자와 역할 사이의 관계를 매핑하는 다 대다 테이블을 사용합니다. 두 대안은 비트 단위 AND 연산자의 존재에 의존하는보다 더 휴대용이다.
-
==============================
3.
SELECT * FROM UserTable WHERE Roles & 6 > 0
-
==============================
4.WHERE MASK1 및 mask2> 0 테이블 SELECT *
WHERE MASK1 및 mask2> 0 테이블 SELECT *
-
==============================
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.찾으려면 모든 프로그래머는 사용
찾으려면 모든 프로그래머는 사용
SELECT * FROM UserTable WHERE Roles & 2 = 2
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
'SQL' 카테고리의 다른 글
[SQL] 당신은 세미콜론을 사용해야 할 때 SQL Server에서 때 GO를 사용한다? (0) | 2020.06.22 |
---|---|
[SQL] 9000 만 개 기록을 처리 SQLite는 할 수 있습니까? (0) | 2020.06.22 |
[SQL] 각 루프에 대한 SQL 서버 (0) | 2020.06.22 |
[SQL] (다른 테이블이다)의 다른 컬럼에 하나 개의 컬럼 데이터를 복사 (0) | 2020.06.22 |
[SQL] 하루 그룹에 SQL 쿼리 (0) | 2020.06.22 |