首页 > 解决方案 > 如何使用 T-SQL 按字母顺序对一行中的值进行重新排序?

问题描述

我需要按字母顺序重新排列表格行中的值,例如:

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');

标签: stringtsqldata-manipulation

解决方案


如果您使用的是 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放在单独的行上,您应该停止,因为那时您的数据已经标准化,或者至少更接近它。


推荐阅读