MSSQL - согласовать результат запроса с использованием IN

В таблице MSSQL ("имя пользователя") у меня есть две следующие записи:

name   ¦  nickname
John      Johny
Marc      Marco

Я хотел бы сделать запрос, который бы возвратил "Джонни, Марко", когда я как k для псевдонимов Джона и Марка.

Я пробовал следующее:

declare @consolidatedNicknames varchar(2000)
set @consolidatedNicknames = ''
select @consolidatedNicknames = @consolidatedNicknames + nickname + ';'
From username WHERE name IN ('John','Marc')

но это только возвращает мне прозвище "Джон".

Как это могло соответствовать прозвищу "Джон" И "Марк"?

Большое спасибо.

2 ответа

Решение

Ваш пример кода работал, как и ожидалось для меня. У меня было несколько проблем с этим методом с большими строками (50 000 символов или более). Вот другая версия, которую я нашел немного более надежной.

DECLARE @consolidatedNicknames varchar(2000)
SET @consolidatedNicknames = ''

SELECT @consolidatedNicknames = 
        STUFF((SELECT ', ' + username.nickname
                FROM username
                WHERE name IN ('John','Marc')
                FOR XML PATH(''),TYPE).value('.','VARCHAR(MAX)')
            , 1, 2, '')

STUFF и XML - это то, что вам нужно. Посмотрите на эту статью

Вот функция, которую я построил, чтобы сделать что-то очень похожее.

CREATE FUNCTION [dbo].[CapOwnerList]
    (
    @Seperator nvarchar(100) = ','
    )

    RETURNS @ConcatValues TABLE
        (
        ID DECIMAL(28,0) NOT NULL
        ,VALUE NVARCHAR(MAX)
        )
    AS
    BEGIN
        DECLARE @TempTable TABLE (ID INT, VAL VARCHAR(MAX));

        INSERT INTO @TempTable (ID,VAL)
        SELECT  C2O.CAP_ID
                ,FP.NAME
        FROM    REL_CAP_HAS_BUS_OWNER C2O
        INNER JOIN
                FACT_PERSON FP
        ON      C2O.PERSON_ID = FP.ID
        ORDER BY
                FP.NAME
        ;

        IF RIGHT(@Seperator,1)<>' '
            SET @Seperator = @Seperator+' ';

        INSERT @ConcatValues
        SELECT  DISTINCT 
                T1.ID
                ,STUFF((SELECT @Seperator + T2.VAL FROM @TempTable AS T2 WHERE T2.ID = T1.ID FOR XML PATH('')), 1, LEN(@Seperator), '') AS VALS
        FROM    @TempTable AS T1;

        RETURN;
    END

GO
Другие вопросы по тегам