0

SQL (MS SQL サーバー 2008) でテキストの書式設定をしようとしています。空の文字列または何らかのテキストを返す 3 つの変数がありますが、null になることはありません。次のようにテキストを表示したいと思います:
@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 に答える