CONCAT

2014-07-25 5 views
1

내가 이렇게 보이는 쿼리를 가지고 :CONCAT

select distinct col1, 
(
    select ltrim(str(col2))+',' 
    from @temp t2 
    where t2.col1 = t1.col1 
    for xml path('') 
) col2 
from @temp t1 

COL2의 값의 일부가 null, 그래서 대신에 널 (null) 문자열을 표시하는가, 그 부분 즉, 완전히

누락

COL2

3,4,3,NULL,2,3,4,3,2, 

을해야하지만, 대신에 나는 점점 오전 :

3,4,3,2,3,4,3,2, 

어떻게 수정합니까?

+0

실행 파일을 게시 할 수 있습니까? 테스트 목적으로 하위 쿼리를 상수 NULL로 바꿉니다. – usr

+0

@usr, 불행히도, 실행 가능한 repro은 나에게 처음이다. 그게 무슨 뜻인지 몰라. – oshirowanen

+0

누구나 잘못된 결과를보기 위해 실행할 수있는 쿼리를 게시하십시오. – usr

답변

2

는 NULL 출력을 얻으려면, 당신은 문자열 'NULL'에 NULL 값을 변경해야합니다. 즉, 필드에 대해 일관된 유형을 갖기 위해 숫자 값을 문자열로 캐스팅해야합니다.

SELECT DISTINCT col1, 
(
    SELECT COALESCE(CAST(col2 AS VARCHAR),'NULL')+',' 
    FROM @temp t2 
    WHERE t2.col1 = t1.col1 
    FOR XML PATH('') 
) col2 
FROM @temp t1 

An SQLfiddle to test with.

0

이 시도 :

SELECT DISTINCT col1, 
     (
      SELECT ISNULL(CAST(col2 AS VARCHAR(10)),'NULL') + ',' 
      FROM @Temp AS T2 
      WHERE T2.col1 = T1.col1 
      FOR XML PATH('') 
     ) AS col2 
FROM @Temp AS T1 

NULL을

값 + NULL을 = 는 NULL 값이

1

됩니다 NULL됩니다 NULL에 대한 값을 추가 문자열 NULL이 아닙니다. 단순히 정보가 없다는 것입니다. col2가 아닌 경우

SELECT CASE 
     WHEN col2 IS NULL THEN 'NULL' 
     ELSE col2 
     END + ',' 

, 그것은 더 간결하게 만들려면 당신이 isnull(col2,'NULL') 또는 coalesce(col2,'NULL')

을 사용할 수 있습니다 : 당신이 할 수있는 것은 지금처럼 목적을 위해 문자열 NULL로 취급하는 NULL 값을 강제하는 것입니다 텍스트 유형은 처음과 같이 위의 해결 방법 중 하나를 사용하기 전에 캐스팅 :

SELECT CASE 
     WHEN col2 IS NULL THEN 'NULL' 
     ELSE CAST(col2 AS VARCHAR(5)) 
     END + ',' 
0

이렇게하면됩니다. 도움이 되었기를 바랍니다

DECLARE @temp TABLE (col1 INT,col2 INT) 

INSERT INTO @temp (col1,col2) 
VALUES (1, 2), 
     (1, 3), 
     (1, 4), 
     (1, NULL), 
     (1, 6), 
     (1, 7) 

SELECT DISTINCT col1, 
      SUBSTRING((
      SELECT ','+LTRIM(ISNULL(STR(col2),'NULL')) 
      FROM @temp AS t2 
      WHERE t2.col1 = t1.col1 
      FOR XML PATH('') 
      ),2,200000) AS col2 
FROM @temp AS t1