ホームページ >データベース >mysql チュートリアル >SQL 列の区切り文字で区切られた値を複数の行に効率的に分割するにはどうすればよいですか?
SQL 列の区切り文字で区切られた値を複数の行に分割する
受信者など、単一の列に区切り文字で区切られた値を含むテーブルを扱う場合-address フィールドをセミコロン (;) で区切ると、さらに処理または分析するためにこれらの値を複数の行に分割する必要があります。この記事では、SQL を使用してこれを実現するさまざまな方法を検討し、特にパフォーマンスと効率の最適化に焦点を当てます。
SQL Server 2016 の STRING_SPLIT 関数の使用
SQL Server を使用している場合2016 以降では、STRING_SPLIT 関数を利用して、区切られた値を効率的に分割できます。この関数の構文は次のとおりです。
STRING_SPLIT(@list, @delimiter)
STRING_SPLIT を使用して受信者アドレスを個別の行に抽出する方法は次のとおりです。
SELECT [message-id], value FROM dbo.SourceData CROSS APPLY STRING_SPLIT([recipient-address], ';') AS f;
Pre 用の分割関数の作成-SQL Server 2016 バージョン
SQL Server バージョンの場合2016 年より前では、カスタム分割関数を作成できました。このような関数の一例は次のとおりです。
CREATE FUNCTION dbo.SplitStrings( @List NVARCHAR(MAX), @Delimiter NVARCHAR(255) ) RETURNS TABLE AS RETURN (SELECT Number = ROW_NUMBER() OVER (ORDER BY Number), Item FROM (SELECT Number, Item = LTRIM(RTRIM(SUBSTRING(@List, Number, CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number))) FROM (SELECT ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_objects AS s1 CROSS APPLY sys.all_objects) AS n(Number) WHERE Number <= CONVERT(INT, LEN(@List)) AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter ) AS y); GO
この関数を使用して、区切り値で区切られた値を次のように分割できます。
SELECT [message-id], f.Item FROM dbo.SourceData CROSS APPLY dbo.SplitStrings([recipient-address], ';') AS f;
最適化と考慮事項
最適なパフォーマンスを確保するには、次の点を考慮してください。ヒント:
以上がSQL 列の区切り文字で区切られた値を複数の行に効率的に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。