sql >> データベース >  >> RDS >> Sqlserver

SQL列の区切り値を複数の行に分割する

    SQLServer2016以降を使用している場合

    新しいSTRING_SPLITを使用できます 関数については、ここでブログを書いています。ブレント・オザルは、ここについてブログを書いています。

    SELECT s.[message-id], f.value
      FROM dbo.SourceData AS s
      CROSS APPLY STRING_SPLIT(s.[recipient-address], ';') as f;
    

    SQLServer2016より前のバージョンをまだ使用している場合

    分割関数を作成します。これは、そこにある多くの例の1つにすぎません:

    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 s.[message-id], f.Item
      FROM dbo.SourceData AS s
      CROSS APPLY dbo.SplitStrings(s.[recipient-address], ';') as f;
    

    また、列名にダッシュを入れないことをお勧めします。つまり、常に[square brackets]に入れる必要があります 。



    1. psycopg2ライブラリがロードされていないインポート:libssl.1.0.0.dylib

    2. 暗号化を利用してPostgreSQLデータベースのセキュリティを強化する

    3. AutoMySQLBackupを使用してMySQLデータベースをバックアップする方法

    4. org.postgresql.util.PSQLException:列インデックスが範囲外です:3、列数:2