默认情况下,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 中找到了一个解决方案,但只针对第一个字符。
答案 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的解决方案做得同样但有点简单......