2013-04-24 62 views
2

我是SQL新手。我有這個工作的SQL函數,但我想用逗號連接結果,如果結果爲空,不會留下無關的逗號。我與COALESCE玩過一段時間,但我無法完成它的工作。任何線索或幫助都會很棒。T-SQL用逗號連接VarChar

在Python我這樣做:

'abcdef'.join(', ') 

這是現在的SQL函數:

USE [Broadcast] 
GO 
/****** Object: UserDefinedFunction [dbo].[MapConsumerAdvice] Script Date: 04/24/2013 14:49:10 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  <Author,,Name> 
-- Create date: <Create Date, ,> 
-- Description: <Description, ,> 
-- ============================================= 
ALTER FUNCTION [dbo].[MapConsumerAdvice] 
(
    @A as Int, 
    @B as Int, 
    @C as Int, 
    @D as Int, 
    @E as Int, 
    @F as Int, 
    @G as Int, 
    @H as Int 
) 
RETURNS VarChar(20) 
AS 
BEGIN 

    DECLARE @Result as VarChar(999) 

    SET @Result = '' 

    IF (@A > 0) SET @Result = @Result + ',' + 'a' 
    IF (@B > 0) SET @Result = @Result + ',' + 'd' 
    IF (@C > 0) SET @Result = @Result + ',' + 'h' 
    IF (@D > 0) SET @Result = @Result + ',' + 'l' 
    IF (@E > 0) SET @Result = @Result + ',' + 'm' 
    IF (@F > 0) SET @Result = @Result + ',' + 'n' 
    IF (@G > 0) SET @Result = @Result + ',' + 's' 
    IF (@H > 0) SET @Result = @Result + ',' + 'v' 

    Return @Result 

END 
+2

推測這應該被標記爲SQL Server。請添加此標籤(如果您使用不同的RDBMS,請添加此標籤)。另外,我強烈建議*不要這樣做。 SQL Server *具有*非常適合存儲多個值的數據類型。它被稱爲表格。如果您使用所提供的類型,則您會發現查詢更易於編寫,並且可能執行得更好。 – 2013-04-24 06:23:45

+0

您需要刪除結果中的前導逗號? – TechDo 2013-04-24 06:27:31

+0

@techdo是的,沒錯。 – MFB 2013-04-24 06:30:38

回答

1

嘗試

RETURN SUBSTRING(@Result, 2, LEN(@Result)) 

RETURN RIGHT(@Result, LEN(@Result)-1) 

,而不是Return @Result

+0

謝謝,效果很好。 – MFB 2013-04-24 06:39:09

0

在函數末尾添加下面的代碼,

RETURN REPLACE(@result,',,',',') 
+0

失蹤'或兩個? – MFB 2013-04-24 06:38:38

+0

你現在可以嘗試和投票:) – Nishad 2013-04-24 06:44:00

+0

如果我沒有錯..我假設如果任何參數的函數是通過''(空格),那麼你需要添加上面的代碼..因爲它可能會在你的結果結束爲a,bc ,, f – Nishad 2013-04-24 06:47:37

0

你需要檢查是否有任何被分配。

USE [Broadcast] 
GO 
/****** Object: UserDefinedFunction [dbo].[MapConsumerAdvice] Script Date: 04/24/2013 14:49:10 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  <Author,,Name> 
-- Create date: <Create Date, ,> 
-- Description: <Description, ,> 
-- ============================================= 
ALTER FUNCTION [dbo].[MapConsumerAdvice] 
(
    @A as Int, 
    @B as Int, 
    @C as Int, 
    @D as Int, 
    @E as Int, 
    @F as Int, 
    @G as Int, 
    @H as Int 
) 
RETURNS VarChar(20) 
AS 
BEGIN 

DECLARE @Result as VarChar(999) 

SET @Result = '' 

IF (@A > 0) SET @Result = @Result + ',' + 'a' 
IF (@B > 0) SET @Result = @Result + ',' + 'd' 
IF (@C > 0) SET @Result = @Result + ',' + 'h' 
IF (@D > 0) SET @Result = @Result + ',' + 'l' 
IF (@E > 0) SET @Result = @Result + ',' + 'm' 
IF (@F > 0) SET @Result = @Result + ',' + 'n' 
IF (@G > 0) SET @Result = @Result + ',' + 's' 
IF (@H > 0) SET @Result = @Result + ',' + 'v' 

IF PATINDEX(',%', @Result) > 1 Set @Result = SUBSTRING(@Result, 2, LEN(@Result)); 

Return @Result 

END