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

カンマ区切りの文字列を解析して、Where句の文字列のINリストを作成します

    この関数を作成します(sqlserver 2005+)

    CREATE function [dbo].[f_split]
    (
    @param nvarchar(max), 
    @delimiter char(1)
    )
    returns @t table (val nvarchar(max), seq int)
    as
    begin
    set @param += @delimiter
    
    ;with a as
    (
    select cast(1 as bigint) f, charindex(@delimiter, @param) t, 1 seq
    union all
    select t + 1, charindex(@delimiter, @param, t + 1), seq + 1
    from a
    where charindex(@delimiter, @param, t + 1) > 0
    )
    insert @t
    select substring(@param, f, t - f), seq from a
    option (maxrecursion 0)
    return
    end
    

    このステートメントを使用する

    SELECT *
    FROM yourtable 
    WHERE account in (SELECT val FROM dbo.f_split(@account, ','))
    

    分割関数とXML分割の比較:

    テストデータ:

    select top 100000 cast(a.number as varchar(10))+','+a.type +','+ cast(a.status as varchar(9))+','+cast(b.number as varchar(10))+','+b.type +','+ cast(b.status as varchar(9)) txt into a 
    from master..spt_values a cross join master..spt_values b
    

    XML:

     SELECT count(t.c.value('.', 'VARCHAR(20)'))
     FROM (
         SELECT top 100000 x = CAST('<t>' + 
               REPLACE(txt, ',', '</t><t>') + '</t>' AS XML)
               from a
     ) a
     CROSS APPLY x.nodes('/t') t(c)
    
    Elapsed time: 1:21 seconds
    

    f_split:

    select count(*) from a cross apply clausens_base.dbo.f_split(a.txt, ',')
    
    Elapsed time: 43 seconds
    

    これは実行ごとに変わりますが、アイデアは得られます



    1. MySQLWITH句

    2. MySQLでロールを使用して特権を管理する方法

    3. Linux /MacからAmazonEC2でMySQLに接続するにはどうすればよいですか?

    4. ドッキングされたPostgreSQLデータベースのバックアップ/復元