2017-11-09 2 views
0

SQL Server 2008 R2의 여러 열을 연결하고 TAB로 구분해야합니다. 지금까지, 난 단지 원시적 인 해결책을 마련 할 수 있었다 : 간결성을 위해 CONCAT 여러 필드에 NULLS가있을 수 있으므로 한 번만 구분 기호를 설정하십시오. SQL Server 2008 R2

select 
    isnull(col1,'') 
    + CHAR(9) 
    + isnull(col2,'') 
    + CHAR(9) 
    + isnull(col3,'') 
    + CHAR(9) 
    + isnull(col4,'') 
    + CHAR(9) 
    + isnull(col5,'') 
from TBL_A 

, 나는 5 열을 포함, 그러나 나는 약 20 열을 연결해야합니다.

어떤 열도 NULL 일 수 있으므로 isnull 문에 각 열을 래핑해야합니다. 모든 열 뒤에 char(9)을 추가해야합니다. CONCAT_WS는이 두 가지 문제를 매우 간단하게 처리 할 수 ​​있지만 SQL Server 2017에서만 사용할 수 있습니다.

누구보다 더 웅장한 방법이 있습니까?

+0

저는 XML 경로를 사용합니다. [여기에 예제가 있습니다] (https://dba.stackexchange.com/a/125780/95107) – scsimon

답변

0

STUFF()FOR XML PATH()의 조합으로, UNPIVOT과 같이 사용하면 도움이됩니다. 나는 여러 null 검사 주위에 방법이 있다고 생각하지 않습니다.

여기에 수행 할 수있는 작업 방법은 fiddle입니다. UNPIVOT과 행 식별자를 사용하여

  1. "Verticalize"데이터는 우리가 나중에 행 그룹으로 다시 집계 할 수 있도록 다음과 같이 여기

    -- schema 
    create table t1 (
        id int 
        ,col1 char(1) 
        ,col2 char(1) 
        ,col3 char(1) 
    ); 
    
    create table t2 
    (
        id int, 
        colVal char(1) 
    ); 
    
    -- some sample data 
    insert into t1 
    select 1, 'a', 'b', 'c' 
    union all 
    select 2, 'd', 'e', 'f'; 
    
    insert into t2 
    select 
        id 
        ,colVal 
    from t1 
    unpivot 
    (
        colVal 
        for cols in (col1, col2, col3) 
    ) u 
    order by 
        id; 
    
    -- the actual query 
    select 
        id 
        ,stuff((
         select 
          '-' 
          + isnull(colVal,'') 
         from 
          t2 as innerTable 
         where 
          innerTable.id = outerTable.id 
         for xml path ('')) 
        ,1 , 1, '') 
    from 
        t2 as outerTable 
    group by 
        id; 
    
    drop table t1; 
    drop table t2; 
    

    과정이다.

  2. 그룹당 의 수직 데이터에 대해 쿼리하려면 correlated subquery을 사용하십시오.

  3. FOR XML PATH('')을 사용하여 레코드 값을 구분 된 문자열로 결합하고 STUFF을 사용하여 선행 구분 기호를 잘라냅니다. 나는 구분이 놀이로 오는 방법이 명확하게 내 예에 대시를 사용했습니다

참고. 또한 레코드에 고유 한 식별자 (예 : id int)가 있다는 가정을했습니다.

+0

'0'앞에 ','가없는 것 같습니다. 또한 ','를 추가하면 null이 반환됩니다. – SRev

+0

@SRev 문제의 초기 오해/과다 단순화에 대해 사과드립니다. 나는 더 나은 질문을 제공하기 위해 나의 대답을 업데이트했다. – pimbrouwers