在SQL中使用[a-9]而不是[0-Z]对ORDER进行ORDER

时间:2012-03-26 13:32:12

标签: sql sqlite sql-order-by

默认情况下,SQL在字符前排序数字。

所以,如果我有“名称”栏目:

abc
ab1
a1b
1ba
1bac
b21

由于SQL按0-Z排序(前0到9,然后是a-Z),查询

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 中找到了一个解决方案,但只针对第一个字符。

5 个答案:

答案 0 :(得分:3)

我建议SELECT另一列,比如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上排序时,数字将是最后的数字。然后,name上的排序将按数字排序。

答案 1 :(得分:2)

这样可以提供数据。

SELECT *
FROM Table
ORDER BY Name COLLATE SQL_EBCDIC037_CP1_CS_AS

但是,您可能希望查看各种排序规则类型,以确保它能够全面满足您的需求。

更新:你提到了SQLite但是我在MSSQL上测试了这个。不确定SQLite中是否提供此排序规则,但下面的注释可能包含有用的信息。

答案 2 :(得分:1)

请测试这些数据

declare @t table(a char(3))
insert @t values('ab1')
insert @t values('a1b')
insert @t values('1ba')
insert @t values('b21')
insert @t values('12a')
insert @t values('13b')


select a,
patindex('[0-9]%', a + 'a'), 
patindex('_[0-9]%', a + 'a'), 
patindex('__[0-9]%', a + 'a')
from @t order by 2, 3, 4, 1

select a
from 
(select a,
patindex('[0-9]%', a + 'a') b, 
patindex('_[0-9]%', a + 'a') c, 
patindex('__[0-9]%', a + 'a') d
from @t) e
order by b, c, d, a

答案 3 :(得分:0)

这是我的想法:你添加另一个“help_column”,检查第一个char是否为数字并为其分配1,否则分配0然后按此列排序,然后按名称排序:

select *, case
             when substring(name,1,1) like '[0-9]' then 1 
             else 0 
          end as help_order
from (
select 'ab1' as name union select 'a1b' as name union select '1ba' as name union select 'b21' as name
) a
order by help_order, name

当然,如果需要,您可能需要改进正则表达式[0-9]以处理多个数字。

当然,你应该用你的表替换内部查询(带有多个联合的查询)。

答案 4 :(得分:0)

Thsi将0-9替换为ASCII 122以上(小写z)。

SQLLite没有CHAR函数来执行字符代码替换(例如CHAR(123)CHAR(132)),而不是我的CHAR(123)尝试

当然未经测试: - )

ORDER BY
   REPLACE
   REPLACE(
   REPLACE(
   REPLACE(
   REPLACE(
   REPLACE(
   REPLACE(
   REPLACE(
   REPLACE(
   REPLACE(name, '0', '{0')
    , '1', '{2')
    , '2', '{2')
    , '3', '{3')
    , '4', '{4')
    , '5', '{5')
    , '6', '{6')
    , '7', '{7')
    , '8', '{8')
    , '9', '{9')

编辑:虽然,@ David Faber的解决方案做得同样但有点简单......