0

我正在尝试使用 sql (MS SQL server 2008) 进行一些文本格式化。我有三个变量,它们要么返回空字符串,要么返回某种文本,它们永远不会为空。我希望以下列方式显示文本:
@Var1='A' @Var2='B' @Var3='C' ==> A, B, C
@Var1='A' @Var2='' @ Var3='C' ==> A, C
@Var1='' @Var2='B' @Var3='C' ==> B, C
@Var1='' @Var2='' @Var3='C' ==> C

.
.
@Var1='' @Var2='' @Var3='' ==>

这是我所拥有的简化版本...

DECLARE @Var1 NVARCHAR(100)
DECLARE @Var2 NVARCHAR(100)
DECLARE @Var3 NVARCHAR(100)
SET @Var1 = 'A'
SET @Var2 = 'B'
SET @Var3 = 'C'
SELECT 
ISNULL(NULLIF(@Var1,''), '') 
    + 
        CASE
            WHEN NULLIF(@Var1,'') IS NOT NULL AND NULLIF(@Var2,'') IS NOT NULL THEN ', ' ELSE '' 
        END 
    +
ISNULL(NULLIF(@Var2,''),'')
    +
        CASE
            WHEN NULLIF(@Var2,'') IS NOT NULL AND NULLIF(@Var3,'') IS NOT NULL THEN ', ' ELSE '' 
        END 
    +
ISNULL(NULLIF(@Var3,''),'')

我觉得我错过了一些重要的细节。让我知道是否需要任何澄清。

4

1 回答 1

3

尝试:

select  case 
        when str is null then ''
        else left(str, len(str)-1) -- Remove last comma
        end
from    (
        select  case when len(@Var1) > 0 then @Var1 + ', ' else '' end + 
                case when len(@Var2) > 0 then @Var2 + ', ' else '' end + 
                case when len(@Var3) > 0 then @Var3 + ', ' else '' end as str
        ) as SubQueryAlias

或者用一个reverse技巧来避免子查询:

select  reverse(stuff(reverse(
        case when len(@Var1) > 0 then @Var1 + ', ' else '' end +
        case when len(@Var2) > 0 then @Var2 + ', ' else '' end +
        case when len(@Var3) > 0 then @Var3 + ', ' else '' end
        ), 1, 2, ''));

这里的关键点是 SQL Server 在文本格式化方面不是很擅长 :) 在 C# 等客户端语言中,你的表现会更好。

SQL Fiddle 上的实时示例。

于 2012-06-22T13:14:48.963 回答