通过仅打印最后一个值的自定义订单

mHe*_*pMe 5 sql sql-server sql-server-2012

我有下面的脚本。它仅打印出一个值,PLGG并非全部。

 Pot

 ABC
 MPOT
 NVPN
 PLGG   
Run Code Online (Sandbox Code Playgroud)

但是,当我删除按案例排序的部分时,它将打印所有值。这是为什么?在这里不可能使用自定义订单吗?

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)
Run Code Online (Sandbox Code Playgroud)

Lar*_*rnu 5

如果您尝试创建一个分隔列表,则有“更好”的方法。如果您使用的是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;
Run Code Online (Sandbox Code Playgroud)

如果您使用的是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,'');
Run Code Online (Sandbox Code Playgroud)