ホームページ >データベース >mysql チュートリアル >SQL 列の区切り文字で区切られた値を複数の行に効率的に分割するにはどうすればよいですか?

SQL 列の区切り文字で区切られた値を複数の行に効率的に分割するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-01 12:47:11724ブラウズ

How to Efficiently Split Delimited Values in a SQL Column into Multiple Rows?

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 Server のバージョンに基づいて適切な方法を使用してください。
  • 非効率的になる可能性があるため、区切り文字の検索に LIKE 演算子の使用は避けてください。
  • 検索を高速化するために、受信者アドレス列にインデックスを付けます。
  • 大きなデータセットを小さなデータセットに分割します。
  • SQL Server の一括挿入メカニズムを使用して、データをデータベースに効率的にインポートします。

以上がSQL 列の区切り文字で区切られた値を複数の行に効率的に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。