默认情况下,sql在字符前排序数字.
所以,如果我有“名称”列:
- abc
- ab1
- a1b
- 1ba
- 1bac
- b21
- SELECT * FROM ... ORDER BY name
将导致:
- 1ba
- 1bac
- a1b
- ab1
- abc
- abc1
- b21
但我希望它按a-0排序(先是a-Z,然后是0-9).
- abc
- abc1
- ab1
- a1b
- b21
- 1ba
- 1bac
如何在查询中执行此操作?更具体地说,我如何在sqlite中执行此操作?
我在Sort MySQL results alphabetically,but with numbers last中找到了一个解决方案,但仅限于第一个char.
解决方法
我建议选择另一个列,比如name_replace,将数字替换为高位ASCII字符(例如〜),然后在该列上排序,然后在名称上排序.不幸的是,sqlite不支持
regular expression替换:
- SELECT name,replace( ... replace(replace(name,'0','~'),'1','~') ... '9','~') AS name_replace
- FROM mytable
- ORDER BY name_replace,name
在name_replace上排序时,数字将是最后的.然后按名称排序将按数字排序.