복붙노트

[SQL] 어떻게 다른 컬럼에 문자열을 분리하는?

SQL

어떻게 다른 컬럼에 문자열을 분리하는?

이 같은 항목이 테이블을했습니다.

    MachineName
-----------------------

    Ab bb zecos
    a zeng
    zeng
    empty

표 4 행.

내가 어떻게 같은 출력을 얻을 수있는 그 4 개 행을 분리 할 수 ​​있습니다.

       M1       M2       M3
-----------------------------------
       Ab       bb      zecos
       a        zeng     NULL
       zeng     NULL     NULL
       NULL     NULL     NULL

해결법

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

    1.대신 분할 기능을 사용하여 delimated 문자열을 spilts 개체의 지정된 부분을 반환 ParseName라는 함수가있다. 이 쿼리를 서면으로 저를 도와 준 ParseName 링크를 통해 이동하십시오

    대신 분할 기능을 사용하여 delimated 문자열을 spilts 개체의 지정된 부분을 반환 ParseName라는 함수가있다. 이 쿼리를 서면으로 저를 도와 준 ParseName 링크를 통해 이동하십시오

    Declare @Sample Table
    (MachineName varchar(max))
    
    Insert into @Sample
    values 
    ('Ab bb zecos'),('a Zeng')
    
    
      SELECT 
      Reverse(ParseName(Replace(Reverse(MachineName), ' ', '.'), 1)) As [M1]
     , Reverse(ParseName(Replace(Reverse(MachineName), ' ', '.'), 2)) As [M2]
     , Reverse(ParseName(Replace(Reverse(MachineName), ' ', '.'), 3)) As [M3]
    
      FROM  (Select MachineName from @Sample
      ) As [x] 
    
  2. ==============================

    2.사용 Parsename () 함수

    사용 Parsename () 함수

    with cte as(
        select 'Aria Karimi' as FullName
        Union
        select 'Joe Karimi' as FullName
        Union
        select 'Bab Karimi' as FullName
    )
    
    SELECT PARSENAME(REPLACE(FullName,' ','.'),2) as Name, PARSENAME(REPLACE(FullName,' ','.'),1) as Family from cte
    

    결과

    Name    Family
    -----   ------
    Aria    Karimi
    Bab     Karimi
    Joe     Karimi
    
  3. ==============================

    3.

    DECLARE @Tmp TABLE (empid INT,joined nchar(10))
    
    INSERT @Tmp SELECT 1,'1990, 1111' 
    INSERT @Tmp SELECT 2,'2000, 2222' 
    
    INSERT @Tmp SELECT 3,'1993, 3333' 
    
    INSERT @Tmp SELECT 4,'1899, 4444' 
    INSERT @Tmp SELECT 5,'1999, 5555' 
    
    INSERT @Tmp SELECT 6,'2001, 6666 ' 
    
    
    --Using PARSENAME 
    
    SELECT empid, joined,
           PARSENAME(REPLACE(joined,',','.'),2) join1, 
           PARSENAME(REPLACE(joined,',','.'),1) join2 
    FROM @Tmp
    
  4. ==============================

    4.이거 한번 해봐:

    이거 한번 해봐:

        CREATE FUNCTION [dbo].[SplitIndex](@Delimiter varchar(20) = ' ', @Search varchar(max), @index int)
        RETURNS varchar(max)
        AS
        BEGIN
              DECLARE @ix int,
                          @pos int,
                        @rt varchar(max)
    
              DECLARE @tb TABLE (Val varchar(max), id int identity(1,1))
    
              SET @ix = 1
              SET @pos = 1
    
    
              WHILE @ix <= LEN(@search) + 1 BEGIN
    
                    SET @ix = CHARINDEX(@Delimiter, @Search, @ix)
    
                    IF @ix = 0
                          SET @ix = LEN(@Search)
                    ELSE
                          SET @ix = @ix - 1
    
                    INSERT INTO @tb
                    SELECT SUBSTRING(@Search, @pos, @ix - @pos + 1)
    
                    SET @ix = @ix + 2
                    SET @pos = @ix
              END
    
              SELECT @Rt = Val FROM @Tb WHERE id = @index
              RETURN @Rt     
        END
    

    사용 같은 :

    SELECT dbo.SplitIndex(' ', 'hello World', 1)
    

    민주당 원 답이 결합하고 당신이 가서 잘되어야합니다

    (지정된 인덱스가 존재하지 않는 경우는 NULL을 반환합니다 참고)

    EG

    SELECT dbo.SplitIndex(' ', 'Hello World', 3)  
    

    인덱스 3이 존재하지 않기 때문에 NULL을 반환

    확실하지 어떤 성능 것은 같은, 난 그냥 가치가 더 MySQL 버전 등으로 재 작성 될 수 있도록 내가 할 거라고 테이블 가치 분할 기능을 수정하지만

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

    5.당신은 C로 프로그래밍하는 경우 ++ 수행하십시오 :

    당신은 C로 프로그래밍하는 경우 ++ 수행하십시오 :

    #include <cstring>
    #include <iomanip>
    
    using namespace std;
    int main () {
    string machine[12];
    for (int i = 0; i < 12; i++) {
        if (machine[i] == "")
            machine[i] = "NULL";
    }
    
    for (int i = 0; i < 3; i++) {
        cout << setw(10) << machine[i] << setw(10) << machine[i+1] << setw(10) << machine[i+2] << endl;
    }
    return 1;
    }
    
  6. from https://stackoverflow.com/questions/11185318/how-to-separate-string-into-different-columns by cc-by-sa and MIT license