我有一个类似的字段:
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
答案 0 :(得分:4)
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))
答案 1 :(得分:1)
如果第一个字符始终是字母,请尝试:
SELECT * FROM
(
SELECT 'A9t' AS sortField UNION ALL
SELECT 'A10t' UNION ALL
SELECT 'A11t'
) t ORDER BY substring(sortField,2,len(sortField)-1) desc
答案 2 :(得分:0)
我会说你已经结合了alpha和数字排序。但我认为你要问的是,你想按升序对字母进行排序,并按降序对数字进行排序,这可能很难以一种漂亮的方式进行。以前的答案对你的问题不起作用,问题是Martin Smith的解决方案没有带两个字母的字符串作为前缀,Parkyprg不会在你要求的字母前对数字进行排序。
您需要做的是使用自定义订单,请参阅此示例:http://www.emadibrahim.com/2007/05/25/custom-sort-order-in-a-sql-statement/,但这是一种繁琐的方式。
编辑:Martins Smith的解决方案已更新并且运行正常!