Создать функцию конкатенации в SQL - PullRequest
0 голосов
/ 21 августа 2010

Предположим, у меня есть таблица a с одним столбцом b и тремя строками (1,2,3), я хотел бы создать функцию, которая будет возвращать '1,2,3', которая будет вызываться так: SELECT FUNC (е), ... ОТ ...

Другими словами, у меня есть связанная таблица, в которой есть несколько строк, связанных с каждой строкой первой таблицы, и я хочу объединить содержимое одного столбца из второй таблицы. В данном случае это список имен, связанных с определенным наблюдением.

Я думал об использовании функции SQL для этого, но я не помню, как ...: (

Спасибо

Ответы [ 5 ]

1 голос
/ 21 августа 2010

Вот пример для 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
0 голосов
/ 21 августа 2010

Полагаю, я собираюсь ответить на свой вопрос, поскольку у меня действительно есть способ сделать это с помощью 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


0 голосов
/ 21 августа 2010
DECLARE @list AS varchar(MAX)

SELECT @list = ISNULL(@list + ',', '') +  b
FROM MyTable

SELECT @list AS Result

Вот способ сделать это рекурсивно (мс sql)

0 голосов
/ 21 августа 2010

Зависит от вашей технологии.

Если это Oracle, проверьте функцию stragg.
http://www.sqlsnippets.com/en/topic-11591.html

Если это MSSQL, используйте трюк ПУТИ XML
http://sqlblogcasts.com/blogs/tonyrogerson/archive/2009/03/29/creating-an-output-csv-using-for-xml-and-multiple-rows.aspx

0 голосов
/ 21 августа 2010

вы можете использовать COALESCE для преобразования значений в одном столбце в CSV

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

Я не уверен, как вы сможете создать функцию если вы не возражаете против создания динамического SQL, который может принять имя столбца, а затем соответствующим образом построить SQL во время выполнения.

редактировать. это работает только для SQL Server. не понял, что ты не упомянул ни одного db.

...