SQL で列データを行に分割する方法
リレーショナル データベースを使用する場合、データを分割する必要がある状況が発生することがあります。単一列のデータを複数の行に分割します。この手法は、項目のカンマ区切りリストを個々の行に分割するなどのシナリオに特に役立ちます。
これを実現するには、SQL の文字列操作関数の機能を活用できます。列データを行に分割する 2 つの方法を見てみましょう:
1。分割関数の使用:
カスタム分割関数を作成して、カンマやセミコロンなどの特定の区切り文字に基づいて列データを分割できます。使用できるサンプル関数を次に示します。
CREATE FUNCTION [dbo].[Split](@String VARCHAR(MAX), @Delimiter CHAR(1)) RETURNS @temptable TABLE (items VARCHAR(MAX)) AS BEGIN DECLARE @idx INT DECLARE @slice VARCHAR(8000) SELECT @idx = 1 IF LEN(@String)<1 OR @String IS NULL RETURN WHILE @idx!= 0 BEGIN SET @idx = CHARINDEX(@Delimiter,@String) IF @idx!=0 SET @slice = LEFT(@String,@idx - 1) ELSE SET @slice = @String IF(LEN(@slice)>0) INSERT INTO @temptable(Items) VALUES(@slice) SET @String = RIGHT(@String,LEN(@String) - @idx) IF LEN(@String) = 0 BREAK END RETURN END;
2.再帰 CTE の使用:
または、再帰共通テーブル式 (CTE) を使用して同じ結果を得ることができます。 CTE ソリューションは次のとおりです:
WITH cte (code, DeclarationItem, Declaration) AS ( SELECT Code, CAST(LEFT(Declaration, CHARINDEX(',',Declaration+',')-1) AS VARCHAR(50)) DeclarationItem, STUFF(Declaration, 1, CHARINDEX(',',Declaration+','), '') Declaration FROM yourtable UNION ALL SELECT code, CAST(LEFT(Declaration, CHARINDEX(',',Declaration+',')-1) AS VARCHAR(50)) DeclarationItem, STUFF(Declaration, 1, CHARINDEX(',',Declaration+','), '') Declaration FROM cte WHERE Declaration > '' ) SELECT code, DeclarationItem FROM cte
使用例:
「yourtable」テーブルの列「Declaration」を個々の行に分割するには、次のいずれかを使用できます。上記の方法のうち。例:
SELECT t1.code, s.items AS declaration FROM yourtable t1 OUTER APPLY dbo.split(t1.declaration, ',') s
このクエリは、「宣言」列が項目ごとに別々の行に分割された結果を生成します。
以上がSQL で列のデータを複数の行に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。