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

区切り記号での T-SQL 分割

    Declare @YourTable table (ID int,IDList varchar(Max))
    Insert Into @YourTable values
    (1,'123|456|789|012|345|320'),
    (2,'123|456')
    
    Select A.ID
          ,B.*
     From @YourTable A
     Cross Apply (
                    Select RetSeq = Row_Number() over (Order By (Select null))
                          ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                    From (Select x = Cast('<x>'+ replace((Select A.IDList as [*] For XML Path('')),'|','</x><x>')+'</x>' as xml).query('.')) as A  
                    Cross Apply x.nodes('x') AS B(i)
                 ) B
    

    返品

    ID  RetSeq  RetVal
    1   1       123
    1   2       456
    1   3       789
    1   4       012
    1   5       345
    1   6       320
    2   1       123
    2   2       456
    
    Select A.ID
          ,B.*
     From @YourTable A
     Cross Apply [dbo].[udf-Str-Parse-8K](A.IDList,'|') B
    

    上記と同じものを返します

    CREATE FUNCTION [dbo].[udf-Str-Parse-8K] (@String varchar(max),@Delimiter varchar(10))
    Returns Table 
    As
    Return (  
        with   cte1(N)   As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
               cte2(N)   As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 a,cte1 b,cte1 c,cte1 d) A ),
               cte3(N)   As (Select 1 Union All Select t.N+DataLength(@Delimiter) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter)) = @Delimiter),
               cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter,@String,s.N),0)-S.N,8000) From cte3 S)
    
        Select RetSeq = Row_Number() over (Order By A.N)
              ,RetVal = Substring(@String, A.N, A.L) 
        From   cte4 A
    );
    --Orginal Source http://www.sqlservercentral.com/articles/Tally+Table/72993/
    --Much faster than str-Parse, but limited to 8K
    --Select * from [dbo].[udf-Str-Parse-8K]('Dog,Cat,House,Car',',')
    --Select * from [dbo].[udf-Str-Parse-8K]('John||Cappelletti||was||here','||')
    
    Declare @String varchar(max) = '123|456|789|012|345|320'
    Declare @Delim  varchar(10)  = '|'
    
    Select RetSeq = Row_Number() over (Order By (Select null))
          ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
    From (Select x = Cast('<x>'+ replace((Select @String as [*] For XML Path('')),@Delim,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i)
    


    1. dbテーブルからテキストを印刷する際の文字セットの問題

    2. PostgreSQL9.2.1とHibernateの接続

    3. Oracleのテーブル変更権限が不十分

    4. トリガーを使用して外部キーチェック制約を実装する