복붙노트

[SQL] SQL Server 2008의 쉼표에 의해 분할 기능

SQL

SQL Server 2008의 쉼표에 의해 분할 기능

나는이 질문에 여러 번 요청되었습니다하지만 내가 필요한 것을 찾을 수 있다는 것을 알고있다.

이 칼럼 다음과 같은 형식의 데이터가 들어있는 "주문"을 가지고있다. 'XXX, YYY, ZZZZ' 내 SELECT 문을 수행 할 때 지금은 분할 이것에 의해 3 열을 채울 필요

EG

Select Name,
    Surname,
    FirstCommaColumn=xx.UpToFirstColumn
    SecondCommaColumn=xx.FromFirstCommaToLastComma,
    ThirdColumnFromSecondCommaOnwards=FromSecondCommaToEnd
from myTable
--thought of doing something like
CROSS APPLY (SELECT TOP 1 * FROM dbo.SplitFunctionIDontHave(order,',')) AS xx

나는 빈을 반환해야하므로 더 쉼표가없는 일부 행이 있습니다. 내가 함수 또는 쿼리 그냥 확인이 작업을 수행하는 방법을 자체 내에서 할 경우 난 상관하지 않습니다.

어떻게 2008 SQL Server를 사용하여이 작업을 수행 할 수 있습니까? 차이를 만드는 경우,이 선택은 뷰의 일부입니다

해결법

  1. ==============================

    1.나는 그것이 분할 () 함수는 정말 무엇에 중복되지 않도록 함수 이름을 변경했습니다.

    나는 그것이 분할 () 함수는 정말 무엇에 중복되지 않도록 함수 이름을 변경했습니다.

    여기에 코드입니다 :

    CREATE FUNCTION dbo.GetColumnValue(
    @String varchar(8000),
    @Delimiter char(1),
    @Column int = 1
    )
    returns varchar(8000)
    as     
    begin
    
    declare @idx int     
    declare @slice varchar(8000)     
    
    select @idx = 1     
        if len(@String)<1 or @String is null  return null
    
    declare @ColCnt int
        set @ColCnt = 1
    
    while (@idx != 0)
    begin     
        set @idx = charindex(@Delimiter,@String)     
        if @idx!=0 begin
            if (@ColCnt = @Column) return left(@String,@idx - 1)        
    
            set @ColCnt = @ColCnt + 1
    
        end
    
        set @String = right(@String,len(@String) - @idx)     
        if len(@String) = 0 break
    end 
    return @String  
    end
    

    그리고 여기 사용법은 다음과 같습니다

    select dbo.GetColumnValue('Col1,Field2,VAlue3', ',', 3)
    
  2. ==============================

    2.

    Declare @str as Varchar(100) = '10|20|30|40|500|55'
    Declare @delimiter As Varchar(1)='|'
    Declare @Temp as Table ( item varchar(100))
    Declare @i as int=0
    Declare @j as int=0
    Set @j = (Len(@str) - len(REPLACE(@str,@delimiter,'')))
    While @i  < = @j
    Begin
      if @i  < @j
      Begin
          Insert into @Temp 
          Values(SUBSTRING(@str,1,Charindex(@delimiter,@str,1)-1))
          set @str = right(@str,(len(@str)- Charindex(@Delominator,@str,1)))
      End
      Else
      Begin
         Insert into @Temp Values(@str)
      End
    
     Set @i = @i + 1
    End
    
    Select * from @Temp 
    
  3. ==============================

    3.이 SQL 서버에는 분할 () 함수는 없지만, 당신은 사용자 정의 함수를 만들 수 있습니다.

    이 SQL 서버에는 분할 () 함수는 없지만, 당신은 사용자 정의 함수를 만들 수 있습니다.

    열을 쉼표로 구분 된 값을 분할하는 방법이 대답을 참조

  4. ==============================

    4.다음과 같은 기능 및 용도 아래를 만들

    다음과 같은 기능 및 용도 아래를 만들

    CREATE FUNCTION [dbo].[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  
    
    SELECT TOP 1 * FROM dbo.Split(order,',')
    
  5. ==============================

    5.그것은 parsename 함께 플레이 할 수있는 좋은 사례처럼 보인다.

    그것은 parsename 함께 플레이 할 수있는 좋은 사례처럼 보인다.

    예를 들어 @Order를 사용하는 편집 :

    DECLARE @Order VARCHAR(MAX) = 'xxx,yyy,zzzz'
    SELECT FirstCommaColumn=PARSENAME(REPLACE(@Order,',','.'),3),
           SecondCommaColumn=PARSENAME(REPLACE(@Order,',','.'),2),
           ThirdColumnFromSecondCommaOnwards=PARSENAME(REPLACE(@Order,',','.'),1)
    
  6. ==============================

    6.

    CREATE FUNCTION [dbo].[splitStr] ( 
    
    @str NVARCHAR(MAX), 
    
        @delimiter CHAR(1) 
    ) 
    
    RETURNS @output TABLE(
    
        RowID   smallint IDENTITY(1,1), 
        t1 NVARCHAR(MAX) ,
        t2 NVARCHAR(MAX) ,
        t3 NVARCHAR(MAX) ,
        t4 NVARCHAR(MAX) ,
        t5 NVARCHAR(MAX) ,
        t6 NVARCHAR(MAX) ,
        t7 NVARCHAR(MAX) ,
        t8 NVARCHAR(MAX) ,
        t9 NVARCHAR(MAX) ,
        t10 NVARCHAR(MAX)   
    ) 
    
    begin
    
        declare @st int, @en int, @xx int
        declare @cntr int
    
        set @cntr = 0
        set @st = 1
        select @en = CHARINDEX(@delimiter, @str, @st)
    
        if @en = 0 
            set @en = LEN(@str)
    
        while @en <= LEN(@str) and @cntr < 11 begin
            set @cntr = @cntr + 1
            set @xx = @en - @st
    
            if @cntr = 1
                insert into @output(t1) values(SUBSTRING(@str, @st, @xx))
            if @cntr = 2 
                update @output set t2 = SUBSTRING(@str, @st, @xx) 
            if @cntr = 3 
                update @output set t3 = SUBSTRING(@str, @st, @xx) 
            if @cntr = 4 
                update @output set t4 = SUBSTRING(@str, @st, @xx) 
            if @cntr = 5 
                update @output set t5 = SUBSTRING(@str, @st, @xx) 
            if @cntr = 6 
                update @output set t6 = SUBSTRING(@str, @st, @xx) 
            if @cntr = 7 
                update @output set t7 = SUBSTRING(@str, @st, @xx) 
            if @cntr = 8 
                update @output set t8 = SUBSTRING(@str, @st, @xx) 
            if @cntr = 9 
                update @output set t9 = SUBSTRING(@str, @st, @xx) 
            if @cntr = 10 
                update @output set t10 = SUBSTRING(@str, @st, @xx)
    
            set @st = @en + 1
    
            if @st > len(@str)
                begin
                    set @en = @en + 100
                end
            else
                begin       
                    select @en = CHARINDEX(@delimiter,@str, @st)
                    if @en = 0 
                        begin
                            set @en = LEN(@str)
                            set @xx = @en - @st
                        end
                end
    
        end 
    
        return  
    
    end
    

    /*

    이것은 당신이 구분에 의해 10 개 필드로 분할 할 수 있습니다. 요구 사항이 10을 초과하는 경우에는 목록에 더 추가 할 수 있습니다.

    용법

    select * from TableName a
    cross apply splitStr(a.FiledName, ',')
    

    */

  7. from https://stackoverflow.com/questions/20512855/split-function-by-comma-in-sql-server-2008 by cc-by-sa and MIT license