2012-06-22 72 views
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 = '' ==>
SQL空字符串和文本格式

這裏是什麼,我有一個簡化版本...

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,''),'') 

我覺得像我我錯過了一些重要的細節。讓我知道是否需要澄清。

回答

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#等客戶端語言無限更好。

Live example at SQL Fiddle.

+0

記得刪除最後的逗號。 –

+0

不幸的是,我沒有這個選項可用,因爲後臺是一個web服務正在調用一個存儲過程並轉換它返回給xml,所以沒有地方可以使用任何客戶端語言。 –

+0

@ user1401635 - 什麼是消費XML?那可以處理三個項目而不是一個? ' xxx yyy'? – MatBailie