2013-09-16 50 views
0

我有以下SQL查詢(SQL Server 2005中):避免NULL值 - 串聯

Select TOP 1000 col1, 
LTRIM(RTRIM(cast(col2 as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(col3 as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(col4 as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(col5 as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(col6 as varchar)))) 
from mytable 

,但我有一些問題,因爲這些列都爲空的,我不能在這個級聯NULL值。在這種情況下避免NULL值的最好方法是什麼?

在此先感謝!

回答

3

包裹在ISNULL()

Select TOP 1000 col1, 
LTRIM(RTRIM(cast(ISNULL(col2,'') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col3,'') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col4,'') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col5,'') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col6,'') as varchar)))) 
from mytable 

或者COALESCE()

Select TOP 1000 col1, 
LTRIM(RTRIM(cast(COALESCE(col2,'') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(COALESCE(col3,'') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(COALESCE(col4,'') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(COALESCE(col5,'') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(COALESCE(col6,'') as varchar)))) 
from mytable 

如果使用SQL Server 2012可以更輕鬆感謝CONCAT()字段(可以更換SPACE(2)也有' | '):

Select TOP 1000 col1 
      ,CONCAT(LTRIM(RTRIM(cast(col2 as varchar))) 
       ,' | ', LTRIM(RTRIM(col3)) 
       ,' | ', LTRIM(RTRIM(col4)) 
       ,' | ', LTRIM(RTRIM(col5)) 
       ,' | ', LTRIM(RTRIM(col6))) 
from mytable 
+0

如果我使用COALESCE(),查詢將如何? –

+0

只是用COALESCE替換ISNULL :-) – dnoeth

+0

:-)哈哈謝謝。我不知道語法完全相同... :-) –

1

通過ISNULL函數,當有一個NUll時,你可以有其他值。下面是一個簡單的查詢:

Select TOP 1000 col1, 
LTRIM(RTRIM(cast(ISNULL(col2,'SOMEVALUE') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col3,'SOMEVALUE') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col4,'SOMEVALUE') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col5,'SOMEVALUE') as varchar))) 
+ SPACE(2) + '|' + SPACE(2) + LTRIM(RTRIM(cast(ISNULL(col6,'SOMEVALUE') as varchar)))) 
from mytable 
1

如果這是一個非關鍵系統,你不能被人打擾凝聚或ISNULL每一列,你可以用它把串聯空值作爲空字符串CONCAT_NULL_YIELDS_NULL服務器變量:

SELECT 'Hi ' + NULL 

會產生空。

SET CONCAT_NULL_YIELDS_NULL OFF 

SELECT 'Hi' + NULL 

SET CONCAT_NULL_YIELDS_NULL ON 

產生:「嗨」。

文檔是here - 請注意,他們將在未來刪除此功能。

否則,只需關閉設置,然後運行原始查詢。

http://technet.microsoft.com/en-us/library/ms176056.aspx

+1

不知道爲什麼你被低估了,你的答案與我讀過的一致。在2012年他們已經改變了這一點,現在可以使用'CONCAT()',但由於OP沒有指定版本,所以我的答案似乎很好。 –

+0

爲什麼建議已被棄用的方法? – gvee

+0

@gvee正如我所說:「如果這是一個非關鍵系統,你不會被困擾到COALESCE或ISNULL每列。這可能是一個快速解決某些問題的方法,所以這不太方便。 – Bridge

0

如果要正確串連你的價值觀,不希望使用一些佔位符空值,使用isnull(或coalesce)+ stuff

select top 1000 
    col1, 
    stuff(
     isnull(' | ' + cast(col2 as varchar), '') + 
     isnull(' | ' + cast(col3 as varchar), '') + 
     isnull(' | ' + cast(col4 as varchar), '') + 
     isnull(' | ' + cast(col5 as varchar), '') 
    , 1, 3, '') 
from mytable 

sql fiddle demo

+0

不知道爲什麼downvote,如果尋找一個一致數量的分隔符,那麼顯然這不會做,但OP沒有指定,所以這個答案增加了價值。 –

+0

@GoatCO實際上,在我看來,用分隔符的數量很難想出解決方案就更困難了。只需放入isnull(..,smth)就很容易,但這是一個可讀的解決方案,可以與null進行適當的連接。感謝upvote,如果它是你:)讓我們等待fo OP,對我來說這看起來他需要我的解決方案:) –