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

SQLServerはコンマ区切りの値を列に分割します

    この問題を動的に解決するには、DSQLを使用して、それに応じて結果に列を追加します。

    --create split function
    CREATE FUNCTION [dbo].[SO_Split]
    (
        @List nvarchar(2000),
        @SplitOn nvarchar(5)
    ) 
    RETURNS @RtnValue table
    (
    
        Id int identity(1,1),
        Value nvarchar(100)
    )
    AS 
    BEGIN
    While (Charindex(@SplitOn,@List)>0)
    Begin
    Insert Into @RtnValue (value)
    Select
        Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
        Set @List =Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
    End
        Insert Into @RtnValue (Value)
        Select Value = ltrim(rtrim(@List))
        Return
    END
    
    --below is the dynamic solution for this problem
    declare @sql nvarchar(3000) = 'select *'
    declare @cnt int = 1
    declare @rowNum int = (select max(a) from (select(select max(id) as id_max from dbo.so_split(mul_query,'*')) as a from #test) as b)
    
    while(@cnt <= @rowNum)
    begin
        set @sql = @sql + N', ISNULL((select value from dbo.so_split(mul_query,''*'') where id = '+cast(@cnt as nvarchar(5))+N'),''1'')'
        set @cnt = @cnt + 1
    end
    
    set @sql = @sql + N' from #test'
    
    exec sp_executesql @sql
    

    結果は以下に添付されています。



    1. 1日の収益分配に基づいて国に固定値を分割する場合は、特定の値を除外します

    2. ユーザー生成のSQL正規表現でのSQLインジェクションの回避

    3. このカンマ区切りデータでグループ化する方法

    4. 2,000万行のデータセットを持つMySQLの重複アイテムを削除するにはどうすればよいですか?