2017-01-11 8 views
0

私はLH1、LH2、LH3、RH1、RH2、RH3のような複数のビット列を持つテーブルを持っています。 (これは一例であり、元のデータベースには20ビット以上の列があります.LHは左手を意味し、RHは右手を意味します)右目、左目、右足、左足などと同じ方法SQLの複数のビット値に基づいて文字列を取得

データ、デザイン、出力内容を表示する下の画像に表示されます。

enter image description here

DDL:今、私はカンマで区切られた文字列を取得したいそれらのビットの値に基づいて

CREATE TABLE #LeftRight 
(
    LH1 BIT, 
    LH2 BIT, 
    LH3 BIT, 
    RH1 BIT, 
    RH2 BIT, 
    RH3 BIT 
) 

INSERT INTO #LeftRight 
     (LH1, LH2, LH3, RH1, RH2, RH3) 
VALUES (1,1,0,1,1,0), (0,1,0,0,0,1), (1,0,1,1,0,1) 

SELECT * 
FROM #LeftRight 

DROP TABLE #LeftRight 

私は下のリンクを通過したが、それはここで

https://dba.stackexchange.com/questions/112408/join-with-comma-separated-values-in-sql-server

+0

私はこれを見て始めましたが、何かする必要があるので、他の誰かが使用できるようにDDLを追加しました。 – Tanner

+0

なぜビットを単一のLH/RH列に格納しないのですか?あなたの人生は、複数のビットフィールドよりもはるかに優れています。以下の解決策は*動作しますが、20列の悪夢*になります。 – Jamiec

+0

Nullを許可するのを削除することを検討しますか? Null値が使用されている状況がない場合は、コードの管理と書き込みが容易です。おそらくデフォルトは0でしょうか? – cloudsafe

答えて

1
Select replace('''' + iif([LH1]=1, '1, ','') + iif([LH2]=1, '2, ','') + iif([LH3]=1, '3, ','') + ''' AS LH, ', ', '' AS LH', ' '' AS LH') + 
     replace('''' + iif([RH1]=1, '1, ','') + iif([RH2]=1, '2, ','') + iif([RH3]=1, '3, ','') + ''' AS RH, ', ', '' AS RH', ' '' AS RH') 
from #LeftRight 
+0

OPが示唆している20 LH/RHカラムのためにこれを書くのは本当ですか?私は知りません。 – Jamiec

+0

「IIF」はSQL Server 2008では使用できません。2012年に追加されました。 –

+0

@Jamiec難しいと私は同意します。私はREPLACEがはるかに効率的であるため編集しました。 – cloudsafe

0

私の場合には有用ではありませんが、いくつかのソリューションです:

DECLARE @t TABLE 
    (
     id INT , 
     LH1 BIT , 
     LH2 BIT , 
     LH3 BIT , 
     RH1 BIT , 
     RH2 BIT , 
     RH3 BIT 
    ) 

INSERT INTO @t 
VALUES (1, 1, 1, 0, 1, 1, 0), 
     (2, 0, 0, 0, 0, 0, 1), 
     (3, 1, 0, 1, 1, 0, 1) 


SELECT REPLACE(CONCAT('Row ', 
         id, 
         ': - ', 
         '''', 
         CASE WHEN LH1 = 1 THEN '1,' END, 
         CASE WHEN LH2 = 1 THEN '2,' END, 
         CASE WHEN LH3 = 1 THEN '3,' END, 
         ''' AS Lh, ''', 
         CASE WHEN RH1 = 1 THEN '1,' END, 
         CASE WHEN RH2 = 1 THEN '2,' END, 
         CASE WHEN RH3 = 1 THEN '3,' END, 
         ''' AS Rh'   
         ), ',''' , '''') 
FROM @t t 

出力:

Row 1: - '1,2' AS Lh, '1,2' AS Rh 
Row 2: - '' AS Lh, '3' AS Rh 
Row 3: - '1,3' AS Lh, '1,3' AS Rh 

古いバージョンの場合:

SELECT REPLACE('Row ' + 
       CAST(id AS VARCHAR(10)) + 
       ': - ''''' + 
       CASE WHEN LH1 = 1 THEN '1,' ELSE '' END + 
       CASE WHEN LH2 = 1 THEN '2,' ELSE '' END + 
       CASE WHEN LH3 = 1 THEN '3,' ELSE '' END + 
       ''' AS Lh, ''' + 
       CASE WHEN RH1 = 1 THEN '1,' ELSE '' END + 
       CASE WHEN RH2 = 1 THEN '2,' ELSE '' END + 
       CASE WHEN RH3 = 1 THEN '3,' ELSE '' END + 
       ''' AS Rh', 
       ',''' , '''') 
+2

SQL Server 2012に「CONCAT」が追加されました。 –

関連する問題