sql >> データベース >  >> RDS >> Sqlserver

SQLServer整数をバイナリ文字列に変換する

    実際、これは単純な古いSQLを使用すると非常に簡単です。ビット単位のANDを使用するだけです。オンラインで投稿された簡単な解決策がなかったことに少し驚いていました(UDFを呼び出さなかった)。私の場合、ビットがオンかオフかを本当に確認したかったのです(データはdotnet eNumsからのものです)。

    したがって、ビット値とバイナリ文字列を別々にまとめて提供する例を次に示します(大きな結合は、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
    


    1. DISTINCTキーワードを使用してSQLiteでAvg()の結果を微調整します

    2. 拡張イベントを使用して、SQL Serverインスタンスで使用されている廃止された機能をログに記録する(T-SQLの例)

    3. FILESTREAMを使用したSQLデータベースへのファイルの保存–パート1

    4. エラーコード:1005。テーブル'...'を作成できません(errno:150)