帮助T-SQL特殊的排序规则
我有一个字段,如:帮助T-SQL特殊的排序规则
SELECT * FROM
(
SELECT 'A9t' AS sortField UNION ALL
SELECT 'A10t' UNION ALL
SELECT 'A11t' UNION ALL
SELECT 'AB9F' UNION ALL
SELECT 'AB10t' UNION ALL
SELECT 'AB11t'
) t ORDER BY sortField
,其结果是:
sortField
---------
A10t
A11t
A9t
AB10t
AB11t
AB9F
其实我需要的是字符串和数字排序规则结合起来:
sortField
---------
A9t
A10t
A11t
AB9F
AB10t
AB11t
如果第一个字符始终是一个信,试试:
SELECT * FROM
(
SELECT 'A9t' AS sortField UNION ALL
SELECT 'A10t' UNION ALL
SELECT 'A11t'
) t ORDER BY substring(sortField,2,len(sortField)-1) desc
SELECT *
FROM (
SELECT 'A9t' AS sortField UNION ALL
SELECT 'A10t' UNION ALL
SELECT 'A11t' UNION ALL
SELECT 'AB9F' UNION ALL
SELECT 'AB10t' UNION ALL
SELECT 'AB11t'
)
t
ORDER BY LEFT(sortField,PATINDEX('%[0-9]%',sortField)-1) ,
CAST(substring(sortField,PATINDEX('%[0-9]%',sortField),1 + PATINDEX('%[0-9][A-Z]%',sortField) -PATINDEX('%[0-9]%',sortField)) AS INT),
substring(sortField,PATINDEX('%[0-9][A-Z]%',sortField) + 1,LEN(sortField))
谢谢,在你的解决方案中字符串是相同的规则,我改了主题,请看看 – guaike 2010-09-27 09:41:51
编辑处理前缀和后缀> 1个字符。 – 2010-09-27 09:53:51
我会说你已经结合了字母和数字排序。但我想你问的是,你想按降序排序字母和数字,这可能很难以一个好看的方式。以前的答案不能解决您的问题,问题是Martin Smith的解决方案不会将两个字母作为前缀的字符串,而Parkyprg也不会在您要求的字母之前对数字进行排序。
您需要做的是使用自定义命令,请参阅示例:http://www.emadibrahim.com/2007/05/25/custom-sort-order-in-a-sql-statement/,但这是一种乏味的方式。
编辑:马丁斯密斯的解决方案更新,工作得很好!
呃,是的,它确实(现在!) – 2010-09-27 09:54:28
是的,在我的文章中很好的修复。如果我可以投票,你会得到我的投票。 – 2010-09-27 09:58:18
前面总有一个字母? – CristiC 2010-09-27 09:25:55
不,可能是'Abc9t' – guaike 2010-09-27 09:33:32
我认为它被称为“自然秩序”。已经有相同(?)的问题[这里](http://stackoverflow.com/questions/34509/natural-human-alpha-numeric-sort-in-microsoft-sql-2005)。 – pascal 2010-09-27 10:39:24