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)
如果您尝试创建一个分隔列表,则有“更好”的方法。如果您使用的是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)
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |