[SQL] 하나의 테이블 컬럼에 다중 비트 값을 저장
SQL하나의 테이블 컬럼에 다중 비트 값을 저장
내가 기록을 예약 할 수 있습니다 데이터베이스에있는 요일 일정의 어떤 종류를 저장할 필요가 하루 또는 일주일에 여러 일 (이 작업을 나타내는 말). 그것을 저장하고 검색하기 쉽습니다 그래서 나는 그것이 하나 개의 컬럼에 저장된해야합니다. 일정이 현재 요일을 일치합니다 그리고 매일 나는 레코드를 선택, 같은 : 나에게 주 7 일의 일정의 일치 일 모든 기록을 얻을.
어떻게 내 마음에 온 것은 각자가 0 의미없는 일정 및 한 수단이 일정 요일을 나타내는 7 비트의 시리즈입니다. 예를 들어 일상적인 작업의 경우에 "1111111"및 "1000000"작업에 대한 그주의 첫날에만 실행됩니다.
그냥 명확하게하기 위해, 기록 따라서 검색에서 유일하게 입력하여 검색 할 수 평일 것, 내가 모르는 일의 조합에 예약 할 수 있습니다.
여기 두 가지 질문이있다 :
해결법
-
==============================
1.당신은 비트 필드로이를 저장 한 후 값을 검색 할 부울 논리 연산자를 사용할 수 있습니다
당신은 비트 필드로이를 저장 한 후 값을 검색 할 부울 논리 연산자를 사용할 수 있습니다
예를 들어 :
CREATE TABLE [dbo].[testBF]( [field1] [varchar](max) NOT NULL, [field2] [varchar](max) NOT NULL, [bitfield] [int] NOT NULL CONSTRAINT [DF_testBF_bitfield] DEFAULT ((0)) ) ON [PRIMARY]
그런 다음 선택에 대한이 :
SELECT field1, field2, CASE WHEN (bitfield & 1) = 1 THEN 'monday ' ELSE '' END + CASE WHEN (bitfield & 2) = 2 THEN 'tuesday ' ELSE '' END + CASE WHEN (bitfield & 4) = 4 THEN 'wednesday ' ELSE '' END + CASE WHEN (bitfield & 8) = 8 THEN 'thursday ' ELSE '' END + CASE WHEN (bitfield & 16) = 16 THEN 'friday' ELSE '' END as [days of week] FROM testBF
화요일 플래그를 포함하는 모든 일을 찾으려면 (화요일은 2 비트 또는 2 ^ 1 또는 2)
SELECT * FROM aTable WHERE (bitfield & 2) = 2
또는
SELECT * FROM aTable WHERE (bitfield & 2) != 0
주, 두 번째 경우에 템플릿이 어떤 비트에 대해 작동합니다 - 금요일 (5 비트 또는 2 ^ 4, 16)을위한 것
SELECT * FROM aTable WHERE (bitfield & 16) != 0
마지막으로 일반적인 경우는 (월요일 1) 숫자를 전달하면 얻을
SELECT * FROM aTable WHERE (bitfield & POWER(2,@inNumOfWeekday-1)) != 0
이것은 당신이 불과 5 (7 비트 필드)로 저장할 수 있습니다 나에게 많은 작업처럼 보이지만 그것은 당신이 그것을 할 수있는 방법이다.
더 많은 예제 나는 또 다른 질문에 대한 쓴 요지를 보면 :
https://gist.github.com/1846338
과 대답 :
https://stackoverflow.com/a/9302106/215752
-
==============================
2.당신은 "비트 마스크"에 대해 말하고있다. 이들은 당신이 쉽게 값을 확인하기 위해 그들에 이진 수학을 적용 할 수있는 유용한 장치입니다,하지만 그들은 약간의 설정을 할. 좀 더이 같이 보일 것이라는 점에 확장합니다.
당신은 "비트 마스크"에 대해 말하고있다. 이들은 당신이 쉽게 값을 확인하기 위해 그들에 이진 수학을 적용 할 수있는 유용한 장치입니다,하지만 그들은 약간의 설정을 할. 좀 더이 같이 보일 것이라는 점에 확장합니다.
-- You will want to work with constants DECLARE @Mon INT, @Tue INT, @Wed INT, @Thu INT, @Fri INT, @Sat INT, @Sun INT SET @Mon = POWER(2,0) -- 1 SET @Tue = POWER(2,1) -- 2 SET @Wed = POWER(2,2) -- 4 SET @Thu = POWER(2,3) -- 8 SET @Fri = POWER(2,4) -- 16 SET @Sat = POWER(2,5) -- 32 SET @Sun = POWER(2,6) -- 64 -- Set Monday and Wednesday UPDATE T SET Schedule = @Mon | @Wed -- Find all tasks scheduled on Tuesday SELECT * FROM T WHERE Schedule & @Tue = @Tue -- Find all tasks scheduled on Tuesday and Saturday SELECT * FROM T WHERE Schedule & @Tue | @Sat = @Tue | @Sat
-
==============================
3.나는 당신이 쉽게 쿼리에 의해 무슨 뜻인지 모르겠어요. 당신이 함수에 포장하면 모든 쉽다. 에 대한 옵션 쉬운 임시 쿼리 쉽게 읽을 문자열 필드를 가지고 프로세스가 그것을 해결 일부 문자열 조작을 사용할 수 있습니다. 예:
나는 당신이 쉽게 쿼리에 의해 무슨 뜻인지 모르겠어요. 당신이 함수에 포장하면 모든 쉽다. 에 대한 옵션 쉬운 임시 쿼리 쉽게 읽을 문자열 필드를 가지고 프로세스가 그것을 해결 일부 문자열 조작을 사용할 수 있습니다. 예:
UPDATE T SET Schedule = 'M|W|H' SELECT * FROM T WHERE CHARINDEX(Schedule, 'M') > -1
-
==============================
4.제목에서, 나는 테이블에 기존의 비트 필드를 갖는 하나의 정수 필드로 변환 할 필요의 상황을 여기 주도했다.
제목에서, 나는 테이블에 기존의 비트 필드를 갖는 하나의 정수 필드로 변환 할 필요의 상황을 여기 주도했다.
의 예를 다음에서 일 - 중 - 주의 당신이 필드라는 이름의 일정 정수 A (비트 마스크)로 변환 할 것을 7 개 각각의 비트 필드가 있다고 가정 해 봅시다 :
UPDATE T SET Schedule = Mon * POWER(2,0) + Tue * POWER(2,1) + Wed * POWER(2,2) + Thu * POWER(2,3) + Fri * POWER(2,4) + Sat * POWER(2,5) + Sun * POWER(2,6)
from https://stackoverflow.com/questions/9643491/store-multiple-bit-values-in-a-single-table-column by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오라클에서 피벗 테이블을 사용하여 조언 (0) | 2020.05.16 |
---|---|
[SQL] ExecuteNonQuery는이 반환 -1 쿼리 문자열에도 불구하고 SQL COUNT를 사용하는 경우 (0) | 2020.05.16 |
[SQL] SQLite는 아이폰에서 열처럼 ROWNUM을 얻는 방법 (0) | 2020.05.16 |
[SQL] SELECT IN 오라클 매개 변수를 사용하여 문제 (0) | 2020.05.16 |
[SQL] SQL Server 2005의 쿼리 성능 (0) | 2020.05.16 |