代码之家  ›  专栏  ›  技术社区  ›  David Brunelle

在SQL中创建连接函数

  •  0
  • David Brunelle  · 技术社区  · 14 年前

    假设我有一个表a,其中有一列b和三行(1,2,3),我想创建一个返回“1,2,3”的函数,调用方式如下:SELECT FUNC(f)。。。来自。。。

    换句话说,我有一个链接表,它有多个行链接到第一个表的每一行,并且希望连接第二个表中一列的内容。在本例中,它是与特定观察相关联的名称列表。

    我想用SQL函数来实现这个,但是我不记得怎么。。。:(

    5 回复  |  直到 14 年前
        1
  •  1
  •   D'Arcy Rittich    14 年前

    下面是SQL Server的一个示例:

    CREATE FUNCTION ConcatenateMyTableValues
    (@ID int)
    RETURNS varchar(max)
    AS
    BEGIN
        declare @s as varchar(max);
        select @s = isnull(@s + ',', '') + MyColumn from MyTable where ID = @ID;
        return @s
    end
    

    select t.ID, t.Name, dbo.ConcatenateMyTableValues(t.ID)
    from SomeTable t
    
        2
  •  0
  •   N30    14 年前

    可以使用COALESCE将一列中的值转换为csv

    http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string

    除非您不介意创建一个动态sql,它可以接受一个列名,然后在运行时相应地构建sql。

    这仅适用于SQL Server。

        3
  •  0
  •   JanW    14 年前
    DECLARE @list AS varchar(MAX)
    
    SELECT @list = ISNULL(@list + ',', '') +  b
    FROM MyTable
    
    SELECT @list AS Result
    

    这里有一种实现这种递归的方法(mssql)

        5
  •  0
  •   David Brunelle    14 年前

    我想我要回答我自己的问题了,因为我真的找到了一种使用CURSOR的方法(我在思考中缺少的关键字…)

    ALTER FUNCTION [dbo].[GET_NOM_MEDECIN_REVISEURS] (@NoAs810 int)
    
    RETURNS NVARCHAR(1000)
    
    AS
    BEGIN
        IF @NoAs810 = 0
            RETURN ''
        ELSE
        BEGIN
            DECLARE @NomsReviseurs NVARCHAR(1000)
            DECLARE @IdReviseurs AS TABLE(IdReviseur int)
            DECLARE @TempNomReviseur NVARCHAR(50)   
            SET @NomsReviseurs = ''
            DECLARE CurReviseur CURSOR FOR 
                SELECT DISTINCT Nom FROM T_Ref_Reviseur R INNER JOIN T_Signature S ON R.IdReviseur = S.idReviseur WHERE NoAs810 = @NoAs810
    
            OPEN CurReviseur
    
            FETCH FROM CurReviseur INTO @TempNomReviseur
            WHILE @@FETCH_STATUS = 0
            BEGIN
                SET @NomsReviseurs = @NomsReviseurs + @TempNomReviseur
                FETCH NEXT FROM CurReviseur INTO @TempNomReviseur
    
                IF @@FETCH_STATUS = 0
                    SET @NomsReviseurs = @NomsReviseurs + ' - '
            END
    
            CLOSE CurReviseur
    
            RETURN @NomsReviseurs
        END
    
        RETURN ''       
    END