2014-06-08 49 views
0

我有一個表有多個可爲空的字符串字段。如何使用空格分隔符連接字符串,其中每個字符串都可以爲空?

對於報告,我想將它們組合成一個單獨的字符串,並用每個字段的空格分隔。右側必須修剪。

測試數據:

DECLARE 
    @test 
TABLE 
(
    f1 NVARCHAR(100) 
    , f2 NVARCHAR(100) 
    , f3 NVARCHAR(100) 
) 

INSERT INTO @test 
-- NULL values must be skipped 
     SELECT NULL  , NULL , NULL 
UNION SELECT NULL  , NULL , 'foo' 
UNION SELECT NULL  , 'foo', NULL 
UNION SELECT 'foo'  , NULL , NULL 
UNION SELECT NULL  , 'foo', 'bar' 
UNION SELECT 'foo'  , 'bar', NULL 
UNION SELECT 'foo'  , NULL , 'bar' 
UNION SELECT 'foo'  , 'bar', 'baz' 
-- Empty string values must be skipped 
UNION SELECT 'foo'  , '' , 'bar' 
UNION SELECT ''   , '' , 'baz' 
-- Spaces in values must be kept 
UNION SELECT 'foo bar', '' , 'baz' 
-- The table should not contain values with surrounding space 
-- So this case is not important 
UNION SELECT ' foo ' , ' ' , 'baz ' 

預期的結果:

'' 
'foo' 
'foo' 
'foo' 
'foo bar' 
'foo bar' 
'foo bar' 
'foo bar baz' 
'foo bar' 
'baz' 
'foo bar baz' 
'foo baz' 
' foo baz' -- This is optional 

我當前的代碼:

SELECT 
    RTRIM(
    CASE WHEN ISNULL(f1, '') = '' THEN '' ELSE f1 + ' ' END 
    + CASE WHEN ISNULL(f2, '') = '' THEN '' ELSE f2 + ' ' END 
    + CASE WHEN ISNULL(f3, '') = '' THEN '' ELSE f3 + ' ' END 
) 
FROM 
    @test 

這工作,但我想知道如果有一個更簡潔的方式爲了達成這個?

回答

1

在SQL Server 2012中,有一個CONCAT函數。 您也可以使用以下內容:

SELECT 
    RTRIM(CONCAT( 
     NULLIF(f1, '') + ' ' 
    , NULLIF(f2, '') + ' ' 
    , NULLIF(f3, '') + ' ' 
)) 
FROM 
    @test 
+0

在你的答案中,優先於使用'+而不是'CONCAT()'的優勢? –

+0

'CONCAT()'根據文檔自動執行'ISNULL':http://msdn.microsoft.com/de-de/library/hh231515.aspx –

+0

我修復了你的答案,這確實比@ podiluska –

1

因爲null +空格仍然null,您可以使用

select 
    isnull(nullif(f1,'')+' ','') + 
    isnull(nullif(f2,'')+' ','') + 
    isnull(nullif(f3,'')+' ','') 
from @test 
+0

不適用於'','','bar''的情況。結果包含前導空格。 –

+1

雖然你可以在裏面添加一個'NULLIF(f1,'')'等等。 –

0

好,podiluska的回答後那麼容易。

select 
    LTRIM(RTRIM(isnull(f1+' ','') + 
    isnull(f2+' ','') + 
    isnull(f3+' ',''))) 
from @test 
相關問題