2016-07-11 5 views
-1

1つのクエリで専門知識が必要:連結された文字列を別々の部分に分割するSQLクエリが必要です。私のデータは、この連結された文字列を別々の部分に分割するためのSQLクエリ

Name Location   Name Link Location Link Final Location  Material 
C50 2398::3276::3916 GA-4-2  58::52::24  558::352::324::70 93530 

のように見えると私はしたい、このような出力:

Name Location   Name Link Location Link Final Location  Material 
C50 2398    GA-4-2  58    558    93530 
C50 3276    GA-4-2  52    352    93530 
C50 3916    GA-4-2  24    324    93530 
C50      GA-4-2      70     93530 
+0

それぞれの位置と最終位置は常に4桁と2桁ですか? – scsimon

+0

@scsimonいいえ、私が言及したちょうどダミー値です。それはそれぞれ4桁以上2桁以下にすることができます。 –

+2

「デザイン」はひどいですね。区切られた列に複数の行のデータが入っています。どのような悪夢。この数の要素が固定されていると、これはうまくいく可能性がありますが、要素数が不明な場合、これは非常に難しいことが分かります。うまくいけば、この練習はこのスキーマの修正の一部です。 –

答えて

1

グラブIDENTITY列が含まれており、取得するために、連結列のそれぞれに機能を使用し、インターネットからのSplit関数それぞれのテーブルを作成し、ID列のすべてのテーブルにジョインします。

+0

これには非常にうまくいくようなスプリッタがあります。 http://www.sqlservercentral.com/articles/Tally+Table/72993/ –

+0

@SeanLange直接クエリを使用するソリューションはありますか?関数を使わずに –

+0

@SeanLangeはMSアクセスでそれを実装するためのクエリがありますか? –

0

これまで述べたように、このデザインは非常に苦労して動作します。それを修正することを検討してください。そうしないと、データベース設計との戦いに敗れ続けることになります。

要素の数が固定されているので、PARSENAMEを使用してこれらの値を分割できます。これがどのように機能するかは次のとおりです。

if OBJECT_ID('tempdb..#Something') is not null 
    drop table #Something 

CREATE TABLE #Something 
(
    Name char(3) 
    , Location varchar(50) 
    , NameLink varchar(10) 
    , LocationLink varchar(50) 
    , FinalLocation varchar(50) 
    , Material int 
) 

insert #Something 
select 'C50' 
    , '2398::3276::3916' 
    , 'GA-4-2' 
    , '58::52::24' 
    , '558::352::324::70' 
    , 93530 

select * from #Something 

select Name 
    , LEFT(Location, charindex(':', Location, 0) - 1) 
    , PARSENAME(replace(Location, '::', '.'), 3) 
    , NameLink 
    , PARSENAME(replace(LocationLink, '::', '.'), 3) 
    , PARSENAME(replace(FinalLocation, '::', '.'), 4) 
    , Material 
from #Something 

UNION ALL 

select Name 
    , LEFT(Location, charindex(':', Location, 0) - 1) 
    , PARSENAME(replace(Location, '::', '.'), 2) 
    , NameLink 
    , PARSENAME(replace(LocationLink, '::', '.'), 2) 
    , PARSENAME(replace(FinalLocation, '::', '.'), 3) 
    , Material 
from #Something 

UNION ALL 

select Name 
    , LEFT(Location, charindex(':', Location, 0) - 1) 
    , PARSENAME(replace(Location, '::', '.'), 1) 
    , NameLink 
    , PARSENAME(replace(LocationLink, '::', '.'), 1) 
    , PARSENAME(replace(FinalLocation, '::', '.'), 2) 
    , Material 
from #Something 

UNION ALL 

select Name 
    , LEFT(Location, charindex(':', Location, 0) - 1) 
    , PARSENAME(replace(Location, '::', '.'), 4) 
    , NameLink 
    , PARSENAME(replace(LocationLink, '::', '.'), 4) 
    , PARSENAME(replace(FinalLocation, '::', '.'), 1) 
    , Material 
from #Something 
関連する問題