복붙노트

[SQL] 어떻게 여러 열 값을 하나의 열 값을 분할하려면?

SQL

어떻게 여러 열 값을 하나의 열 값을 분할하려면?

여러 개의 열 값에 문제 분할 단일 컬럼 값을 가지고있다.

예를 들면 :

Name
------------
abcd efgh
ijk lmn opq
asd j. asdjja
asb (asdfas) asd
asd

나는 이런 식으로 출력 뭔가가 필요 :

first_name             last_name
----------------------------------
abcd                     efgh
ijk                      opq
asd                      asdjja
asb                      asd
asd                      null

중간 이름 (더 중간 이름에 대한 필요) 열이 이미 생성되어 그 하나의 이름 열에서 데이터를 삽입 할 필요를 생략 할 수 없습니다.

해결법

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

    1.당신의 접근 방식은 제대로 이름을 많이 취급하지만 것입니다 ...

    당신의 접근 방식은 제대로 이름을 많이 취급하지만 것입니다 ...

    SELECT CASE
             WHEN name LIKE '% %' THEN LEFT(name, Charindex(' ', name) - 1)
             ELSE name
           END,
           CASE
             WHEN name LIKE '% %' THEN RIGHT(name, Charindex(' ', Reverse(name)) - 1)
           END
    FROM   YourTable 
    
  2. ==============================

    2.마틴에 대한 대안

    마틴에 대한 대안

    select LEFT(name, CHARINDEX(' ', name + ' ') -1),
           STUFF(name, 1, Len(Name) +1- CHARINDEX(' ',Reverse(name)), '')
    from somenames
    

    샘플 테이블

    create table somenames (Name varchar(100))
    insert somenames select 'abcd efgh'
    insert somenames select 'ijk lmn opq'
    insert somenames select 'asd j. asdjja'
    insert somenames select 'asb (asdfas) asd'
    insert somenames select 'asd'
    insert somenames select ''
    insert somenames select null
    
  3. ==============================

    3.당신은 무엇이 필요 분할 사용자 정의 함수입니다. 그것으로,이 솔루션은 같다

    당신은 무엇이 필요 분할 사용자 정의 함수입니다. 그것으로,이 솔루션은 같다

    With SplitValues As
        (
        Select T.Name, Z.Position, Z.Value
            , Row_Number() Over ( Partition By T.Name Order By Z.Position ) As Num
        From Table As T
            Cross Apply dbo.udf_Split( T.Name, ' ' ) As Z
        )
    Select Name
        , FirstName.Value
        , Case When ThirdName Is Null Then SecondName Else ThirdName End As LastName
    From SplitValues As FirstName
        Left Join SplitValues As SecondName
            On S2.Name = S1.Name
                And S2.Num = 2
        Left Join SplitValues As ThirdName
            On S2.Name = S1.Name
                And S2.Num = 3
    Where FirstName.Num = 1
    

    다음은 샘플 분할 기능입니다 :

    Create Function [dbo].[udf_Split]
    (   
        @DelimitedList nvarchar(max)
        , @Delimiter nvarchar(2) = ','
    )
    RETURNS TABLE 
    AS
    RETURN 
        (
        With CorrectedList As
            (
            Select Case When Left(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End
                + @DelimitedList
                + Case When Right(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End
                As List
                , Len(@Delimiter) As DelimiterLen
            )
            , Numbers As 
            (
            Select TOP( Coalesce(DataLength(@DelimitedList)/2,0) ) Row_Number() Over ( Order By c1.object_id ) As Value
            From sys.columns As c1
                Cross Join sys.columns As c2
            )
        Select CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen As Position
            , Substring (
                        CL.List
                        , CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen     
                        , CharIndex(@Delimiter, CL.list, N.Value + 1)                           
                            - ( CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen ) 
                        ) As Value
        From CorrectedList As CL
            Cross Join Numbers As N
        Where N.Value <= DataLength(CL.List) / 2
            And Substring(CL.List, N.Value, CL.DelimiterLen) = @Delimiter
        )
    
  4. ==============================

    4.

    ;WITH Split_Names (Name, xmlname)
    AS
    (
        SELECT 
        Name,
        CONVERT(XML,'<Names><name>'  
        + REPLACE(Name,' ', '</name><name>') + '</name></Names>') AS xmlname
          FROM somenames
    )
    
     SELECT       
     xmlname.value('/Names[1]/name[1]','varchar(100)') AS first_name,    
     xmlname.value('/Names[1]/name[2]','varchar(100)') AS last_name
     FROM Split_Names
    

    또한 참조 아래 링크를 확인

    http://jahaines.blogspot.in/2009/06/converting-delimited-string-of-values.html

  5. ==============================

    5.

    SELECT
       SUBSTRING_INDEX(SUBSTRING_INDEX(rent, ' ', 1), ' ', -1) AS currency,
       SUBSTRING_INDEX(SUBSTRING_INDEX(rent, ' ', 3), ' ', -1) AS rent
    FROM tolets
    
  6. ==============================

    6.내가 SQLite는 데이터베이스에 이런 짓을하는 방법을 여기에 있습니다 :

    내가 SQLite는 데이터베이스에 이런 짓을하는 방법을 여기에 있습니다 :

    SELECT SUBSTR(name, 1,INSTR(name, " ")-1) as Firstname,
    SUBSTR(name, INSTR(name," ")+1, LENGTH(name)) as Lastname
    FROM YourTable;
    

    희망이 도움이.

  7. from https://stackoverflow.com/questions/5123585/how-to-split-a-single-column-values-to-multiple-column-values by cc-by-sa and MIT license