我创建了一个VARCHAR
我的 SQL Server 表之一中名为“SequentialOrder”的列。它保存应用程序的版本号,格式为“MajorVersion.MinorVersion.RevisionVersion”,例如“2.5.1”。我想检索此表的内容并按 AppVersion 编号降序对它们进行排序,以便最新版本位于顶部。
但是,当我执行 ORDER BY SequentialOrder ASC
时,结果按字符串排序而不是数字排序。所以 12.1.1 低于 5.1.1,这对于我想做的事情来说是错误的。关于如何解决这个问题有什么想法吗?
SELECT sectionorder
FROM section
ORDER BY CASE
WHEN sectionorder<> '' THEN sectionorder
ELSE CAST('/' + REPLACE(sectionorder, '.', '/') + '/' AS hierarchyid)
END
-输出:
11.9.0
1.1
3.2
1.1.3
2.3.4
1.4.5
1.2.9
[空字符串]
[空字符串]
我需要这样的精确输出:
1.1
3.2
1.1.3
1.2.9
1.4.5
2.3.4
11.9.0
[空字符串]
[空字符串]
最佳答案
对于 SQL Server,PARSENAME功能。
SELECT GCOI, SequentialOrder, SortTitle
FROM Title
ORDER BY CAST( ISNULL( PARSENAME( SequentialOrder, 3 ), -1 ) AS int) DESC
, CAST( ISNULL( PARSENAME( SequentialOrder, 2 ), -1 ) AS int) DESC
, CAST( ISNULL( PARSENAME( SequentialOrder ,1 ), -1 ) AS int) DESC
已更新以反射(reflect)按最后要求排序的 null
顺序。
再次更新以反射(reflect)降序。
关于sql-server - SqlHierarchyId.Parse 失败,因为输入字符串 '1.1.3' 不是 SqlHierarchyId 节点的有效字符串表示形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39570592/