복붙노트

[SQL] 하나의 테이블 컬럼에 다중 비트 값을 저장

SQL

하나의 테이블 컬럼에 다중 비트 값을 저장

내가 기록을 예약 할 수 있습니다 데이터베이스에있는 요일 일정의 어떤 종류를 저장할 필요가 하루 또는 일주일에 여러 일 (이 작업을 나타내는 말). 그것을 저장하고 검색하기 쉽습니다 그래서 나는 그것이 하나 개의 컬럼에 저장된해야합니다. 일정이 현재 요일을 일치합니다 그리고 매일 나는 레코드를 선택, 같은 : 나에게 주 7 일의 일정의 일치 일 모든 기록을 얻을.

어떻게 내 마음에 온 것은 각자가 0 의미없는 일정 및 한 수단이 일정 요일을 나타내는 7 비트의 시리즈입니다. 예를 들어 일상적인 작업의 경우에 "1111111"및 "1000000"작업에 대한 그주의 첫날에만 실행됩니다.

그냥 명확하게하기 위해, 기록 따라서 검색에서 유일하게 입력하여 검색 할 수 평일 것, 내가 모르는 일의 조합에 예약 할 수 있습니다.

여기 두 가지 질문이있다 :

해결법

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

    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. ==============================

    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. ==============================

    3.나는 당신이 쉽게 쿼리에 의해 무슨 뜻인지 모르겠어요. 당신이 함수에 포장하면 모든 쉽다. 에 대한 옵션 쉬운 임시 쿼리 쉽게 읽을 문자열 필드를 가지고 프로세스가 그것을 해결 일부 문자열 조작을 사용할 수 있습니다. 예:

    나는 당신이 쉽게 쿼리에 의해 무슨 뜻인지 모르겠어요. 당신이 함수에 포장하면 모든 쉽다. 에 대한 옵션 쉬운 임시 쿼리 쉽게 읽을 문자열 필드를 가지고 프로세스가 그것을 해결 일부 문자열 조작을 사용할 수 있습니다. 예:

    UPDATE T SET Schedule = 'M|W|H'
    
    SELECT * FROM T WHERE CHARINDEX(Schedule, 'M') > -1
    
  4. ==============================

    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)
    
  5. from https://stackoverflow.com/questions/9643491/store-multiple-bit-values-in-a-single-table-column by cc-by-sa and MIT license