2014-07-25 31 views
1

我有一個查詢看起來是這樣的:的毗連與NULL值

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

一些COL2值都是零,這樣反而顯示與空字符串,這部分缺失完全,即

COL2應該有

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

而是我得到:

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

我該如何糾正?

+0

你能發佈一個可執行的repro?出於測試目的,將子查詢替換爲常量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

ANY VALUE + NULL = NULL

1

一個空值不是字符串NULL。這僅僅是缺乏信息。你可以做的是迫使NULL值將被視爲字符串NULL爲您的目的,像這樣:

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

爲了使它更加簡潔,您可以使用isnull(col2,'NULL')coalesce(col2,'NULL')

如果col2不文本類型,首先使用任何像這樣的上述解決方案之前,將它轉換:

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