人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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での実現となります。

●質問者: gin106
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ
●250ポイント ベストアンサー

データ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 ● ふるるP
●50ポイント

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


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

gin106さんのコメント
これは、本当に”たまたま” 例として示した物に格納しているデータの数が PARSEnameに合致しているから実現出来る・・・ですね これは厳しい! >< しかし、面白い!!

3 ● こばさん
●200ポイント

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

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


gin106さんのコメント
なるほど! この方法ですよね・・・ 詳しく有難うございます!

gin106さんのコメント
てか・・・どこがTAB??ですか?

こばさんさんのコメント
dbo.Split の関数の中で DECLARE @SeparatorChar as varchar(max) = CHAR(9); ってやってますが、CHAR(9) がタブコードです。 ここを ,(カンマ) にすればカンマを区切り記号と使います。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ