2017-09-15 17 views
0

8ビット列の複数の列があります(例: '01001000')。私は、各列の文字列を各ビットごとに1つずつ8列に分割したいと考えています。SQL Server列のバイナリ文字列を別々の列のビットに分割します。

substring(str, n, 1)何度もコピーして貼り付けるよりクリーンな方法がありますか?

注記次に、別の列でグループ化し、それぞれのビット位置ごとに1の数を数えます。理解を深めるために。

答えて

0

あなたの現在のテーブルからこの新しいテーブルにINSERT INTO ... SELECTを行い、その後、8ビット列を持つ新しいテーブルを作成します。

INSERT INTO newTable (b1, b2, b3, b4, b5, b6, b7, b8) 
SELECT 
    CAST(SUBSTRING(col, 1, 1) AS BIT), 
    CAST(SUBSTRING(col, 2, 1) AS BIT), 
    CAST(SUBSTRING(col, 3, 1) AS BIT), 
    CAST(SUBSTRING(col, 4, 1) AS BIT), 
    CAST(SUBSTRING(col, 5, 1) AS BIT), 
    CAST(SUBSTRING(col, 6, 1) AS BIT), 
    CAST(SUBSTRING(col, 7, 1) AS BIT), 
    CAST(SUBSTRING(col, 8, 1) AS BIT) 
FROM oldTable 
1

私はこれが役立つかもしれないと思う:

CREATE TABLE tab123(B1 INT, B2 INT, B3 INT, B4 INT, B5 INT, B6 INT, B7 INT, B8 INT) 

DECLARE @TAB VARCHAR(100) = '01001000', 
    @VALUES VARCHAR(MAX) = 'INSERT INTO TAB123 SELECT ' 

SELECT @VALUES = @VALUES + VAL 
    FROM 
     (
     SELECT SUBSTRING(@TAB, NUMBER, 1) + ',' VAL 
      FROM master.dbo.spt_values 
      WHERE TYPE = 'P' AND NUMBER BETWEEN 1 AND LEN(@TAB) 
    ) AS A 

SELECT @VALUES = SUBSTRING(@VALUES, 1, LEN(@VALUES) - 1) 

EXEC (@VALUES) 

SELECT * FROM tab123 

DROP TABLE tab123 
+0

をうーん、私はこれがあると思います適切なトラックではなく、いくつかの列に役立ち、より大きなクエリにネストされていれば、それを関数に変換する必要があります。どうすればいい? – user3496060

関連する問題