SQL Server2008で以下を実現するSQLを教えてください

 ※出来る!と言い切られたので・・・

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人3回まで
  • 登録:
  • 終了:2013/05/30 09:11:15
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント250pt

データ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) です。

その他の回答2件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198ここでベストアンサー

ポイント250pt

データ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) です。

id:frkw2004 No.2

回答回数194ベストアンサー獲得回数21

ポイント50pt

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

id:a-kuma3

説明のコメントを入れておかないと、何をやってるか分からなくなりそうですね :-)

2013/05/24 12:27:52
id:gin106

これは、本当に”たまたま” 例として示した物に格納しているデータの数が
PARSEnameに合致しているから実現出来る・・・ですね

これは厳しい! >< しかし、面白い!!

2013/05/24 16:55:27
id:wakwak_koba No.3

回答回数106ベストアンサー獲得回数14

ポイント200pt

融通きく方法を書きます。
タブ区切り→テーブルに変換する汎用的なテーブル関数を予め作成

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が戻るだけでエラーで落ちない)

他1件のコメントを見る
id:gin106

てか・・・どこがTAB??ですか?

2013/05/27 09:10:47
id:wakwak_koba

dbo.Split の関数の中で

DECLARE @SeparatorChar as varchar(max) = CHAR(9);

ってやってますが、CHAR(9) がタブコードです。
ここを ,(カンマ) にすればカンマを区切り記号と使います。

2013/05/27 13:00:24

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません