我需要按字母顺序对表行中的值进行重新排序,例如:
Id Values
--------------------------------
1 Banana, Apple, Oranges
2 Oranges, Melon, Cucumber
3 Cucumber, Banana, Apple
预期输出应为:
Id Values
--------------------------------
1 Apple, Banana, Oranges
2 Cucumber, Melon, Oranges
3 Apple, Banana, Cucumber
您可以使用以下代码生成上述数据:
CREATE TABLE [Table] (
[Id] INT NOT NULL,
[Values] VARCHAR(30) NOT NULL,
CONSTRAINT [PK_Table_Id] PRIMARY KEY CLUSTERED ([Id])
);
GO
INSERT INTO [Table] ([Id], [Values]) VALUES (1, 'Banana, Apple, Oranges'),(2, 'Oranges, Melon, Cucumber'),(3, 'Cucumber, Banana, Apple');
答案 0 :(得分:1)
如果您使用的是SQL Server 2017或更高版本,我们可以结合使用STRING_SPLIT
和STRING_AGG
:
WITH cte AS (
SELECT Id, value
FROM [Table]
CROSS APPLY STRING_SPLIT([Values], ', ')
)
SELECT
Id,
STRING_AGG(value, ', ') WITHIN GROUP (ORDER BY value) AS [Values]
FROM cte
GROUP BY Id
ORDER BY Id;
但是,我强烈建议您停止上述CTE步骤,因为从一开始就将CSV值存储在表中是个坏主意。因此,一旦每个Id
的每个值都放在单独的行上,就应该停止操作,因为这样一来,您的数据已经被规范化,或者至少已经更接近于此。