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