次の表があるとしましょう。
UserId | メッセージ ------- | ----------------- 1 | こんにちは、良い一日を 2 | こんにちは、いい一日でした
すべての{Hi、-have-a-nice-day-I-had}の単語を個別に用意する必要があります。それを行う方法はありますか?データベーステーブル全体から単語をエクスポートしたい場合はどうなりますか?
同様の結果も良いでしょう。
次の表があるとしましょう。
UserId | メッセージ ------- | ----------------- 1 | こんにちは、良い一日を 2 | こんにちは、いい一日でした
すべての{Hi、-have-a-nice-day-I-had}の単語を個別に用意する必要があります。それを行う方法はありますか?データベーステーブル全体から単語をエクスポートしたい場合はどうなりますか?
同様の結果も良いでしょう。
これを試してください:SQLServer2005以降
create table yourtable(RowID int, Layout varchar(200))
INSERT yourtable VALUES (1,'hello,world,welcome,to,tsql')
INSERT yourtable VALUES (2,'welcome,to,stackoverflow')
;WITH SplitSting AS
(
SELECT
RowID,LEFT(Layout,CHARINDEX(',',Layout)-1) AS Part
,RIGHT(Layout,LEN(Layout)-CHARINDEX(',',Layout)) AS Remainder
FROM YourTable
WHERE Layout IS NOT NULL AND CHARINDEX(',',Layout)>0
UNION ALL
SELECT
RowID,LEFT(Remainder,CHARINDEX(',',Remainder)-1)
,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(',',Remainder))
FROM SplitSting
WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)>0
UNION ALL
SELECT
RowID,Remainder,null
FROM SplitSting
WHERE Remainder IS NOT NULL AND CHARINDEX(',',Remainder)=0
)
SELECT part FROM SplitSting ORDER BY RowID
さて、わかりました、ここに行きます。
SQL Serverでは、これを使用できます...
SELECT word = d.value('.', 'nvarchar(max)')
FROM
(SELECT xmlWords = CAST(
'<a><i>' + replace([Message], ' ', '</i><i>') + '</i></a>' AS xml)
FROM MyMessageTbl) T(c)
CROSS APPLY c.nodes('/a/i') U(d)
また、MySQLでも、XMLサポート(ExtractValue()など)を使用して同じものを使用できることを願っています。
編集:説明
- replace([Message], ' ', '</i><i>') replaces e.g. 'my word' with 'my</i><i>word'
- then I add the beginning and the end of xml -> '<a><i>my</i><i>word</i></a>', so I have a valid xml... and cast it to xml type to be able to do something with it
- I select from that xml and shred xml nodes '/a/i' it to rows using CROSS APPLY c.nodes('/a/i');
alias rows using U(d), so one 'i' maps to column d (e.g. 'my')
- d.value('.', 'nvarchar(max)') extracts node content and casts it to character type