※出来る!と言い切られたので・・・
Table-A と言うテーブルが有るとします
構成は
int Key
Varchar(1024) D-AREA
ここで上記のD-AREAには、データがTAB区切りで以下の様に格納されているとします。
D-AREA の中身
データ1 TAB(\t) データ2 TAB(\t) データ3 TAB(\t) データ4
この時、
上記のテーブル中から以下の項目を取り出すSQLを教えてください。
KEY データ1 データ3
本来はTransact-SQLでの実現となります。
データ1
left(D-AREA,CHARINDEX(' ',D-AREA)-1)
データ3
SUBSTRING(D-AREA,
CHARINDEX(' ',D-AREA,CHARINDEX(' ',D-AREA)+1)+1,
CHARINDEX(' ',D-AREA,CHARINDEX(' ',D-AREA,CHARINDEX(' ',D-AREA)+1)+1)-
CHARINDEX(' ',D-AREA,CHARINDEX(' ',D-AREA)+1))
これで いかがでしょうか?
' 'は TAB(\t) です。
データ1
left(D-AREA,CHARINDEX(' ',D-AREA)-1)
データ3
SUBSTRING(D-AREA,
CHARINDEX(' ',D-AREA,CHARINDEX(' ',D-AREA)+1)+1,
CHARINDEX(' ',D-AREA,CHARINDEX(' ',D-AREA,CHARINDEX(' ',D-AREA)+1)+1)-
CHARINDEX(' ',D-AREA,CHARINDEX(' ',D-AREA)+1))
これで いかがでしょうか?
' 'は TAB(\t) です。
tabがちょうど3つあるのでこんな手法も。
Select Key
, PARSEname(Replace(D_AREA, Char(9),'.') ,4) as Data1
, PARSEname(Replace(D_AREA, Char(9),'.') ,2) as Data3
From Table_A
融通きく方法を書きます。
タブ区切り→テーブルに変換する汎用的なテーブル関数を予め作成
CREATE FUNCTION dbo.Split ( @Texts as nvarchar(max) ) RETURNS @Table TABLE ( [No] int IDENTITY(1,1), [Text] varchar(max) ) AS BEGIN DECLARE @SeparatorChar as varchar(max) = CHAR(9); DECLARE @Cnt int; DECLARE @NextChar nvarchar(1); DECLARE @SaveText nvarchar(max); SELECT @Cnt = 1, @NextChar = '', @SaveText = ''; WHILE @Cnt <= LEN(@Texts) BEGIN SET @NextChar = SUBSTRING(@Texts, @Cnt, 1); IF @NextChar = @SeparatorChar BEGIN IF @SaveText is null or LEN(@SaveText)>0 INSERT INTO @Table VALUES(@SaveText); SELECT @SaveText = ''; END IF @NextChar <> @SeparatorChar SELECT @SaveText = @SaveText + SUBSTRING(@Texts, @Cnt, 1); SET @Cnt = @Cnt + 1; END IF @SaveText is null or LEN(@SaveText)>0 INSERT INTO @Table VALUES(@SaveText); RETURN END
この関数を利用して
select [KEY] ,(select [Text] from dbo.Split(D-AREA) where No=1) as データ1 ,(select [Text] from dbo.Split(D-AREA) where No=3) as データ3 from Table-A
NO=xx の部分は動的に指定できますので、タブ区切りの何個目の項目を抜き出すかも自由自在です。
(項目数を超える指定をしてもNULLが戻るだけでエラーで落ちない)
てか・・・どこがTAB??ですか?
dbo.Split の関数の中で
DECLARE @SeparatorChar as varchar(max) = CHAR(9);
ってやってますが、CHAR(9) がタブコードです。
ここを ,(カンマ) にすればカンマを区切り記号と使います。
説明のコメントを入れておかないと、何をやってるか分からなくなりそうですね :-)
2013/05/24 12:27:52これは、本当に”たまたま” 例として示した物に格納しているデータの数が
2013/05/24 16:55:27PARSEnameに合致しているから実現出来る・・・ですね
これは厳しい! >< しかし、面白い!!