индивидуальный заказ, печатая только последнее значение - PullRequest
5 голосов
/ 22 октября 2019

У меня есть скрипт ниже. Он выводит только одно значение, PLGG не все из них.

 Pot

 ABC
 MPOT
 NVPN
 PLGG   

Однако, когда я удаляю секцию order by case, он печатает все значения. Почему это? Здесь нельзя использовать заказ?

declare @pot nvarchar(max) = ''

select @pot = @pot + QUOTENAME(pot) + ',' 
from myTbl
group by pot
order by case when pot = 'MPot' then '1'
else pot end

print(@pot)

Ответы [ 3 ]

5 голосов
/ 22 октября 2019

Если вы пытаетесь создать список с разделителями, есть «лучшие» способы. Если вы используете 2017+, вы можете использовать STRING_AGG:

CREATE TABLE dbo.myTbl (Pot varchar(4));

INSERT INTO dbo.myTbl (Pot)
VALUES('ABC'),
      ('MPOT'),
      ('NVPN'),
      ('PLGG');
GO
DECLARE @Pot nvarchar(MAX)

SET @Pot = (SELECT STRING_AGG(QUOTENAME(Pot), ',') WITHIN GROUP (ORDER BY CASE WHEN Pot = 'MPot' THEN '1' ELSE Pot END) FROM dbo.myTbl);

PRINT @Pot;

Если вы используете 2016-, то вы можете использовать FOR XML PATH:

DECLARE @Pot nvarchar(MAX);

SET @Pot = STUFF((SELECT ',' + QUOTENAME(Pot)
                  FROM dbo.myTbl
                  ORDER BY CASE WHEN Pot = 'MPot' THEN '1' ELSE Pot END
                  FOR XML PATH(N''), TYPE).value('.', 'nvarchar(MAX)'),1,1,'');
1 голос
/ 22 октября 2019

Я могу только представить, что вы пытаетесь объединить значения в определенном порядке. Я рекомендую:

declare @pot nvarchar(max) = '';

select @pot = string_agg( pot, ',') within group (order by case when pot = 'MPot' then '1' else pot end) 
from (select distinct pot from myTbl) t;

print @pot;
0 голосов
/ 22 октября 2019

Вот мое решение

declare @mytbl as table(pot nvarchar(max),n int)
insert into @mytbl values('',0),('ABC',0),('MPOT',-1),('NVPN',0),('PLGG',0)



declare @pot nvarchar(max) = ''

select @pot = @pot + QUOTENAME(pot) + ',' 
from @mytbl
group by pot,n
order by n--case when pot = 'MPot' then '1'else pot end
print(@pot)
...