SQL SERVER 2005 SQL排序:排序varchar数据类型
数据类型为varchar
应该
1.aaaa
5.xx
11.bbbbbb
12
15.
我怎么能得到这个排序顺序
错误
排序1.aaaa
11.bbbbbb
12
15.
5.xx
SQL SERVER 2005 SQL排序:排序varchar数据类型
数据类型为varchar
应该
1.aaaa
5.xx
11.bbbbbb
12
15.
我怎么能得到这个排序顺序
错误
排序1.aaaa
11.bbbbbb
12
15.
5.xx
在Oracle上,这可行。
SELECT
*
FROM
table
ORDER BY
to_number(regexp_substr(COLUMN,'^[0-9]+')),
regexp_substr(column,'\..*');
为什么这会得到downvoted? OP没有指定DBMS。这也给出了可以做什么的想法。 –
@ThorstenDittmar - 查看编辑历史。它最初建议'ORDER BY to_number(column)',因为内容不完全是数字,所以会失败。 –
@MartinSmith那么,这是因为删除,修改,然后取消删除。 –
如果所有的条目都有这种形式,你可以将它们像这样分成两个部分,排序是这些,例如:
ORDER BY
CONVERT(INT, SUBSTRING(fieldname, 1, CHARINDEX('.', fieldname))),
SUBSTRING(fieldname, CHARINDEX('.', fieldname) + 1, LEN(fieldname))
这应该做一个数字排序的前部分.
和.
之后的部分使用字母数字排序,但可能需要进行一些调整,因为我没有真正尝试过。
另一种方法(或更快)可能是创建计算列,该列包含.
之前和.
之后的部分并按它们排序。
第三种方法(如果您不能创建计算列)可能是在表中创建一个视图,该表有两个额外的列与字段的相应部分,然后在该视图上进行选择。
您可以通过根据期间('。')左侧的内容计算一列来做到这一点。
但是,除非您能够对字符串内容进行大量断言,否则这种方法将非常难以在生产系统中使用。
另外处理字符串而不期间可能会导致一些悲伤
with r as (
select '1.aaaa' as string
union select '5.xx'
union select '11.bbbbbb'
union select '12'
union select '15.')
select *
from r
order by
CONVERT(int, left(r.string, case when (CHARINDEX('.', r.string)-1 < 1)
then LEN(r.string)
else CHARINDEX('.', r.string)-1 end)),
r.string
一个简单的解决方案是将'5.xx'如'005.xx' – Andomar
啊,字母数字的排序:-) –
另一种解决方案的乐趣会将数字前缀和alpha后缀存储在适当数据类型的单独列中。 –