복붙노트

[SQL] 바이너리 문자열로 SQL 서버 변환 정수

SQL

바이너리 문자열로 SQL 서버 변환 정수

바이너리 표현으로 정수로 변환 한 다음 VARCHAR로 저장하는 SQL의 쉬운 방법이 있다면 궁금 해서요.

예를 들어 5 "101"로 변환 될 수와 VARCHAR로 저장.

해결법

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

    1.다음은 함수로 코딩 할 수있다. 당신은 당신의 질문의 요구 사항을 충족하기 위해 맨 앞에 0을 잘라내해야합니다.

    다음은 함수로 코딩 할 수있다. 당신은 당신의 질문의 요구 사항을 충족하기 위해 맨 앞에 0을 잘라내해야합니다.

    declare @intvalue int
    set @intvalue=5
    
    declare @vsresult varchar(64)
    declare @inti int
    select @inti = 64, @vsresult = ''
    while @inti>0
      begin
        select @vsresult=convert(char(1), @intvalue % 2)+@vsresult
        select @intvalue = convert(int, (@intvalue / 2)), @inti=@inti-1
      end
    select @vsresult
    
  2. ==============================

    2.사실이 평범한 구식 SQL을 사용하여 정말 간단합니다. 그냥 비트 AND 연산을 사용합니다. 나는 약간은하지 간단한 솔루션 (UDF를 invovled하지 않았다) 온라인으로 게시가 있다고 깜짝 놀라게했다. 비트 또는 (데이터가 DOTNET 열거에서 오는) 떨어져 있다면 내 경우에는 정말 확인하고 싶었다.

    사실이 평범한 구식 SQL을 사용하여 정말 간단합니다. 그냥 비트 AND 연산을 사용합니다. 나는 약간은하지 간단한 솔루션 (UDF를 invovled하지 않았다) 온라인으로 게시가 있다고 깜짝 놀라게했다. 비트 또는 (데이터가 DOTNET 열거에서 오는) 떨어져 있다면 내 경우에는 정말 확인하고 싶었다.

    : 비트 값 이진 문자열 (큰 노동 조합 DB를 통해 작동 번호를 생산 단지 해키 방법입니다 - 따라서 여기에 별도로 함께 당신을 줄 것이다 예입니다

        select t.Number
        , cast(t.Number & 64 as bit) as bit7
        , cast(t.Number & 32 as bit) as bit6
        , cast(t.Number & 16 as bit) as bit5
        , cast(t.Number & 8 as bit) as bit4
        , cast(t.Number & 4 as bit) as bit3
        , cast(t.Number & 2 as bit)  as bit2
        ,cast(t.Number & 1 as bit) as bit1
    
        , cast(cast(t.Number & 64 as bit) as CHAR(1)) 
        +cast( cast(t.Number & 32 as bit) as CHAR(1))
        +cast( cast(t.Number & 16 as bit)  as CHAR(1))
        +cast( cast(t.Number & 8 as bit)  as CHAR(1))
        +cast( cast(t.Number & 4 as bit)  as CHAR(1))
        +cast( cast(t.Number & 2 as bit)   as CHAR(1))
        +cast(cast(t.Number & 1 as bit)  as CHAR(1)) as binary_string
        --to explicitly answer the question, on MSSQL without using REGEXP (which would make it simple)
        ,SUBSTRING(cast(cast(t.Number & 64 as bit) as CHAR(1)) 
                        +cast( cast(t.Number & 32 as bit) as CHAR(1))
                        +cast( cast(t.Number & 16 as bit)  as CHAR(1))
                        +cast( cast(t.Number & 8 as bit)  as CHAR(1))
                        +cast( cast(t.Number & 4 as bit)  as CHAR(1))
                        +cast( cast(t.Number & 2 as bit)   as CHAR(1))
                        +cast(cast(t.Number & 1 as bit)  as CHAR(1))
                        ,
                        PATINDEX('%1%', cast(cast(t.Number & 64 as bit) as CHAR(1)) 
                                            +cast( cast(t.Number & 32 as bit) as CHAR(1))
                                            +cast( cast(t.Number & 16 as bit)  as CHAR(1))
                                            +cast( cast(t.Number & 8 as bit)  as CHAR(1))
                                            +cast( cast(t.Number & 4 as bit)  as CHAR(1))
                                            +cast( cast(t.Number & 2 as bit)   as CHAR(1))
                                            +cast(cast(t.Number & 1 as bit)  as CHAR(1)  )
                        )
    ,99)
    
    
    from (select 1 as Number union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 
        union all select 7 union all select 8 union all select 9 union all select 10) as t
    

    이 결과를 생성합니다 :

    num  bit7 bit6 bit5 bit4 bit3 bit2 bit1 binary_string   binary_string_trimmed 
    1    0    0    0    0    0    0    1    0000001         1
    2    0    0    0    0    0    1    0    0000010         10
    3    0    0    0    0    0    1    1    0000011         11
    4    0    0    0    1    0    0    0    0000100         100
    5    0    0    0    0    1    0    1    0000101         101
    6    0    0    0    0    1    1    0    0000110         110
    7    0    0    0    0    1    1    1    0000111         111
    8    0    0    0    1    0    0    0    0001000         1000
    9    0    0    0    1    0    0    1    0001001         1001
    10   0    0    0    1    0    1    0    0001010         1010
    
  3. ==============================

    3.이는 일반적인 기본 변환기입니다

    이는 일반적인 기본 변환기입니다

    http://dpatrickcaldwell.blogspot.com/2009/05/converting-decimal-to-hexadecimal-with.html

    넌 할 수있어

    select reverse(dbo.ConvertToBase(5, 2))   -- 101
    
  4. ==============================

    4.나는 단지 출력에 숫자의 하드 수 있도록 제한을 발견하기 때문에 여기에 숀에서 허용 대답에 변화의 비트가 있습니다. 내 일상적인 사용에서, 나는 그것이 더 유용 중 가장 높은 1 자리 만 일어나, 또는 내가 다시를 기대하고있어 얼마나 많은 숫자 지정 찾을 수 있습니다. 그것은 0으로 자동 패드 측면 그래서 그것이 라인까지 8, 16을 것이다, 또는 당신이 원하는 비트의 어떤 수.

    나는 단지 출력에 숫자의 하드 수 있도록 제한을 발견하기 때문에 여기에 숀에서 허용 대답에 변화의 비트가 있습니다. 내 일상적인 사용에서, 나는 그것이 더 유용 중 가장 높은 1 자리 만 일어나, 또는 내가 다시를 기대하고있어 얼마나 많은 숫자 지정 찾을 수 있습니다. 그것은 0으로 자동 패드 측면 그래서 그것이 라인까지 8, 16을 것이다, 또는 당신이 원하는 비트의 어떤 수.

    Create function f_DecimalToBinaryString
        (
            @Dec int,
            @MaxLength int = null
        )
    Returns varchar(max)
    as Begin
    
        Declare @BinStr varchar(max) = '';
    
        -- Perform the translation from Dec to Bin
        While @Dec > 0 Begin
    
            Set @BinStr = Convert(char(1), @Dec % 2) + @BinStr;
            Set @Dec = Convert(int, @Dec /2);
    
        End;
    
        -- Either pad or trim the output to match the number of digits specified.
        If (@MaxLength is not null) Begin
            If @MaxLength <= Len(@BinStr) Begin -- Trim down
                Set @BinStr = SubString(@BinStr, Len(@BinStr) - (@MaxLength - 1), @MaxLength);
            End Else Begin -- Pad up
                Set @BinStr = Replicate('0', @MaxLength - Len(@BinStr)) + @BinStr;
            End;
        End;
    
        Return @BinStr;
    
    End;
    
  5. ==============================

    5.

    declare @i int /* input */
    set @i = 42
    
    declare @result varchar(32) /* SQL Server int is 32 bits wide */
    set @result = ''
    while 1 = 1 begin
      select @result = convert(char(1), @i % 2) + @result,
             @i = convert(int, @i / 2)
      if @i = 0 break
    end
    
    select @result
    
  6. ==============================

    6.

    declare @intVal Int 
    set @intVal = power(2,12)+ power(2,5) + power(2,1);
    With ComputeBin (IntVal, BinVal,FinalBin)
    As
        (
        Select @IntVal IntVal, @intVal %2 BinVal , convert(nvarchar(max),(@intVal %2 ))     FinalBin
        Union all
        Select IntVal /2, (IntVal /2) %2, convert(nvarchar(max),(IntVal /2) %2) + FinalBin     FinalBin
        From ComputeBin
        Where IntVal /2 > 0
    )
    select FinalBin from ComputeBin where intval = ( select min(intval) from ComputeBin);
    
  7. ==============================

    7.나는 이진에 진수로 변환하는 다음 ITVF 기능을 사용 그것은 여러가 옵티 마이저에 의해 수행 읽기에 대해 당신은 "걱정"를 필요로하지 않는 인라인 함수 때문이다.

    나는 이진에 진수로 변환하는 다음 ITVF 기능을 사용 그것은 여러가 옵티 마이저에 의해 수행 읽기에 대해 당신은 "걱정"를 필요로하지 않는 인라인 함수 때문이다.

            CREATE FUNCTION dbo.udf_DecimalToBinary 
        (
            @Decimal VARCHAR(32)
        )
    
        RETURNS TABLE AS RETURN
    
        WITH Tally (n) AS
        (
            --32 Rows
            SELECT TOP 30 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1
            FROM (VALUES (0),(0),(0),(0)) a(n)
            CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
    
         ) 
    
         , Anchor (n, divisor , Result) as 
         (
         SELECT t.N , 
                CONVERT(BIGINT, @Decimal) / POWER(2,T.N) ,  
                CONVERT(BIGINT, @Decimal) / POWER(2,T.N) % 2 
         FROM Tally t 
         WHERE CONVERT(bigint,@Decimal) >= POWER(2,t.n)
         )
    
    
         SELECT TwoBaseBinary =  '' +
            (SELECT Result 
              FROM Anchor
              ORDER BY N DESC 
              FOR XML PATH ('') , TYPE).value('.','varchar(200)')
    
       /*How to use*/
       SELECT TwoBaseBinary 
       FROM dbo.udf_DecimalToBinary ('1234')
    
       /*result -> 10011010010*/
    
  8. ==============================

    8.나는이 방법은 다른 사람들이 제시하는 다른 아이디어를 많이 단순화 있다고 생각합니다. 그것은 이진 숫자를 생성하는 CTE로 FOR XML을 트릭과 함께 비트 연산을 사용합니다.

    나는이 방법은 다른 사람들이 제시하는 다른 아이디어를 많이 단순화 있다고 생각합니다. 그것은 이진 숫자를 생성하는 CTE로 FOR XML을 트릭과 함께 비트 연산을 사용합니다.

    DECLARE @my_int INT = 5
    
    ;WITH CTE_Binary AS
    (
        SELECT 1 AS seq, 1 AS val
        UNION ALL
        SELECT seq + 1 AS seq, power(2, seq)
        FROM CTE_Binary
        WHERE
            seq < 8
    )
    SELECT
    (
        SELECT
            CAST(CASE WHEN B2.seq IS NOT NULL THEN 1 ELSE 0 END AS CHAR(1))
        FROM
            CTE_Binary B1
        LEFT OUTER JOIN CTE_Binary B2 ON
            B2.seq = B1.seq AND
            @my_int & B2.val = B2.val
        ORDER BY
            B1.seq DESC
        FOR XML PATH('')
    ) AS val
    
  9. ==============================

    9.

    with t as (select * from (values (0),(1)) as t(c)),
    
    t0 as (table t),
    t1 as (table t),
    t2 as (table t),
    t3 as (table t),
    t4 as (table t),
    t5 as (table t),
    t6 as (table t),
    t7 as (table t),
    t8 as (table t),
    t9 as (table t),
    ta as (table t),
    tb as (table t),
    tc as (table t),
    td as (table t),
    te as (table t),
    tf as (table t)
    
    select  '' || t0.c || t1.c || t2.c || t3.c || t4.c || t5.c || t6.c || t7.c || t8.c || t9.c || ta.c || tb.c || tc.c || td.c || te.c || tf.c as n
    from  t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,ta,tb,tc,td,te,tf
    order by n 
    
    limit 1 offset 5
    

    (PostgreSQL을 테스트) 표준 SQL.

  10. ==============================

    10.SQL 서버에, 당신은 아래의 예제처럼 뭔가를 시도 할 수 있습니다 :

    SQL 서버에, 당신은 아래의 예제처럼 뭔가를 시도 할 수 있습니다 :

    DECLARE  @Int int = 321
    
    SELECT @Int
    ,CONCAT
    (CAST(@Int & power(2,15)    AS bit)
    ,CAST(@Int & power(2,14)    AS bit)
    ,CAST(@Int & power(2,13)    AS bit)
    ,CAST(@Int & power(2,12)    AS bit)
    ,CAST(@Int & power(2,11)    AS bit)
    ,CAST(@Int & power(2,10)    AS bit)
    ,CAST(@Int & power(2,9)     AS bit)
    ,CAST(@Int & power(2,8)     AS bit)
    ,CAST(@Int & power(2,7)     AS bit)
    ,CAST(@Int & power(2,6)     AS bit)
    ,CAST(@Int & power(2,5)     AS bit)
    ,CAST(@Int & power(2,4)     AS bit)
    ,CAST(@Int & power(2,3)     AS bit)
    ,CAST(@Int & power(2,2)     AS bit)
    ,CAST(@Int & power(2,1)     AS bit)
    ,CAST(@Int & power(2,0)     AS bit) ) AS BitString
    
    ,CAST(@Int & power(2,15)    AS bit) AS BIT15
    ,CAST(@Int & power(2,14)    AS bit) AS BIT14
    ,CAST(@Int & power(2,13)    AS bit) AS BIT13
    ,CAST(@Int & power(2,12)    AS bit) AS BIT12
    ,CAST(@Int & power(2,11)    AS bit) AS BIT11
    ,CAST(@Int & power(2,10)    AS bit) AS BIT10
    ,CAST(@Int & power(2,9)     AS bit) AS BIT9 
    ,CAST(@Int & power(2,8)     AS bit) AS BIT8 
    ,CAST(@Int & power(2,7)     AS bit) AS BIT7 
    ,CAST(@Int & power(2,6)     AS bit) AS BIT6 
    ,CAST(@Int & power(2,5)     AS bit) AS BIT5 
    ,CAST(@Int & power(2,4)     AS bit) AS BIT4 
    ,CAST(@Int & power(2,3)     AS bit) AS BIT3 
    ,CAST(@Int & power(2,2)     AS bit) AS BIT2 
    ,CAST(@Int & power(2,1)     AS bit) AS BIT1 
    ,CAST(@Int & power(2,0)     AS bit) AS BIT0  
    
  11. ==============================

    11.나는 여기에 게임에 조금 늦게 해요 알고 있지만 나는 최근 집계 테이블 활용이를위한 매끄러운 솔루션을 함께했다 (위 @hkravitz 솔루션과 유사합니다.)의 주요 차이점은 내 레버리지가 제가 가상 인덱스를 호출이다 실행 계획에 정렬 연산자없이 결과를 내림차순으로 정렬합니다. 이 게시물의 끝에 포함되는 이용이 달성 dbo.rangeAB.

    나는 여기에 게임에 조금 늦게 해요 알고 있지만 나는 최근 집계 테이블 활용이를위한 매끄러운 솔루션을 함께했다 (위 @hkravitz 솔루션과 유사합니다.)의 주요 차이점은 내 레버리지가 제가 가상 인덱스를 호출이다 실행 계획에 정렬 연산자없이 결과를 내림차순으로 정렬합니다. 이 게시물의 끝에 포함되는 이용이 달성 dbo.rangeAB.

    참고 오름차순 (행 번호에 대한 "RN"와 같은)이 반환 숫자 0 ~ 30 :

    SELECT   r.RN
    FROM     dbo.rangeAB(0,30,1,0) AS r
    ORDER BY r.RN;
    

    그것은 정렬하지 않고 그렇게한다. RN은 ROW_NUMBER ()를 OVER (ORDER BY (SELECT NULL))을 정의 할 수있다. 놀이 가상 지수 - RN으로 정렬하면 다시 정렬을 필요로하지 않습니다.

    나는 일종의 그러나 하강을 할 때 나는 일종의을받을 수 있나요

  12. ==============================

    12.이것은 어떤가요...

    이것은 어떤가요...

    SELECT number_value
    ,MOD(number_value / 32768, 2) AS BIT15
    ,MOD(number_value / 16384, 2) AS BIT14
    ,MOD(number_value /  8192, 2) AS BIT13
    ,MOD(number_value /  4096, 2) AS BIT12
    ,MOD(number_value /  2048, 2) AS BIT11
    ,MOD(number_value /  1024, 2) AS BIT10
    ,MOD(number_value /   512, 2) AS BIT9 
    ,MOD(number_value /   256, 2) AS BIT8 
    ,MOD(number_value /   128, 2) AS BIT7 
    ,MOD(number_value /    64, 2) AS BIT6 
    ,MOD(number_value /    32, 2) AS BIT5 
    ,MOD(number_value /    16, 2) AS BIT4 
    ,MOD(number_value /     8, 2) AS BIT3 
    ,MOD(number_value /     4, 2) AS BIT2 
    ,MOD(number_value /     2, 2) AS BIT1 
    ,MOD(number_value      , 2) AS BIT0 
    FROM your_table;
    
  13. from https://stackoverflow.com/questions/127116/sql-server-convert-integer-to-binary-string by cc-by-sa and MIT license