如何用空格分隔符连接字符串,每个字符串可以为空?

时间:2014-06-08 09:56:29

标签: sql sql-server null string-concatenation null-coalescing

我有一个包含多个可空字符串字段的表。

对于报告,我想将它们组合成一个字符串,该字符串用每个字段的空格分隔。必须修剪右侧。

测试数据:

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

这有效,但我想知道是否有一种不那么冗长的方法来实现这个目标?

3 个答案:

答案 0 :(得分:1)

由于null +空格仍为null,您可以使用

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

答案 1 :(得分:1)

在SQL Server 2012中,有一个CONCAT功能。 您也可以使用以下内容:

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

答案 2 :(得分:0)

好吧,在podiluska的回答之后这么容易。

select 
    LTRIM(RTRIM(isnull(f1+' ','') + 
    isnull(f2+' ','') + 
    isnull(f3+' ','') ))
from @test