我有一个包含多个可空字符串字段的表。
对于报告,我想将它们组合成一个字符串,该字符串用每个字段的空格分隔。必须修剪右侧。
测试数据:
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
这有效,但我想知道是否有一种不那么冗长的方法来实现这个目标?
答案 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