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

SQL Server:分割操作

    テーブル値パラメータを使用できない場合は、次を参照してください:"配列とリストErlandSommarskogによる「SQLServer2008のテーブル値パラメーターの使用」 、SQLServerで文字列を分割する方法はたくさんあります。この記事では、ほぼすべての方法の長所と短所について説明します。

    " SQL Server 2005以降の配列とリスト(テーブル値パラメーターがない場合) ErlandSommarskogによる「Cutit」

    分割関数を作成する必要があります。分割関数の使用方法は次のとおりです。

    SELECT
        *
        FROM YourTable                               y
        INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value
    

    TSQLで文字列を分割するのに数値テーブルアプローチが好きです> ただし、SQLServerで文字列を分割する方法は多数あります。それぞれの長所と短所を説明している前のリンクを参照してください。

    Numbers Tableメソッドを機能させるには、この1回限りのテーブル設定を行う必要があります。これにより、テーブルNumbersが作成されます。 1から10,000までの行が含まれています:

    SELECT TOP 10000 IDENTITY(int,1,1) AS Number
        INTO Numbers
        FROM sys.objects s1
        CROSS JOIN sys.objects s2
    ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
    

    Numbersテーブルを設定したら、次の分割関数を作成します。

    CREATE FUNCTION [dbo].[FN_ListToTable]
    (
         @SplitOn  char(1)      --REQUIRED, the character to split the @List string on
        ,@List     varchar(8000)--REQUIRED, the list to split apart
    )
    RETURNS TABLE
    AS
    RETURN 
    (
    
        ----------------
        --SINGLE QUERY-- --this will not return empty rows
        ----------------
        SELECT
            ListValue
            FROM (SELECT
                      LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
                      FROM (
                               SELECT @SplitOn + @List + @SplitOn AS List2
                           ) AS dt
                          INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
                      WHERE SUBSTRING(List2, number, 1) = @SplitOn
                 ) dt2
            WHERE ListValue IS NOT NULL AND ListValue!=''
    
    );
    GO 
    

    CSV文字列をテーブルに簡単に分割して結合できるようになりました:

    select * from dbo.FN_ListToTable(' ','stack over flow')
    

    出力:

    ListValue
    -------------------
    stack
    over
    flow
    
    (3 row(s) affected)
    


    1. SSISパッケージの作成-OracleからSQLServerにデータをコピーするには

    2. SQLのみを使用してSQLServer2005の画像フィールドに画像を挿入する

    3. MySQLデータベースの変更を追跡するためのトリガー

    4. mySQLdateTimerangeクエリの問題