SQL - 对CSV字段进行排序

时间:2013-04-22 07:20:12

标签: sql sorting csv

我的SQL服务器中有一个CSV字段,其中包含X天数。

以下是数字示例(以便于阅读):

1,2,3,4
4,5,1,9
3,6,8,4

我想对每一行进行排序。有一个简单的方法吗? 我希望得到以下结果:

1,2,3,4
1,4,5,9
3,4,6,8

谢谢!

3 个答案:

答案 0 :(得分:0)

该功能在SQL语言中不是标准功能,也不能在SQL Server中使用。

您可以做的是在任何.NET语言中编写用户定义函数(UDF),然后在查询中调用该函数。函数本身只需要一个字符串作为输入,期望一个CSV值,并返回该字符串的排序版本。然后,您可以使用该函数查询表格,如下所示:

SELECT SortedCsv(NumbersOfDays) FROM MyTable

您可以在本文中找到有关在.NET(C#)中编写UDF的更多信息:http://www.dotnetspider.com/resources/19679-Creating-User-Defined-Function-Using-Managed-Code.aspx和此文章:http://www.diaryofaninja.com/blog/2010/09/06/hidden-gems-microsoft-sql-net-managed-code-support

祝你好运!

答案 1 :(得分:0)

我建议你使用像python这样的编程语言来读取每一行,对它进行排序,并可选择将它放回到SQL中。

答案 2 :(得分:0)

试试这个

DECLARE @CSV TABLE(RID INT,ID INT,COL_NAME VARCHAR(MAX))

INSERT INTO @CSV(RID,ID,COL_NAME)
 SELECT 
  ROW_NUMBER() OVER(PARTITION BY ID ORDER BY COL_NAME) AS RID
  ,ID,COL_NAME FROM
  (
    SELECT ID , Split.a.value('.', 'VARCHAR(100)') AS COL_NAME  
    FROM  
    (  
     SELECT ROW_NUMBER() OVER(ORDER BY COL_NAME) AS ID,  
     CAST ('<M>' + REPLACE(COL_NAME, ',', '</M><M>') + '</M>' AS XML) AS COL_NAME
     FROM  TABLE_NAME
    ) AS A CROSS APPLY COL_NAME.nodes ('/M') AS Split(a)
  ) v


SELECT COL_NAME FROM 
(
  SELECT DISTINCT  C1.ID,
  STUFF((SELECT ',' + C2.COL_NAME  AS [text()] FROM @CSV C2
         WHERE C2.ID = C1.ID FOR XML PATH('')),1,1,'' ) AS COL_NAME
  FROM @CSV C1
) RESULT
ORDER BY COL_NAME

将“COL_NAME”和“TABLE_NAME”替换为列amd表名称