如何根据数字对字符串排序?

时间:2018-10-24 16:03:04

标签: mysql sql

我正在研究要根据数字对字符串进行排序的sql查询。

我有一个列(列名是名称)表,其中有多个字段。使用ORDER BY NAME时,它将以以下方式打印:

hello_world
hello_world10
hello_world11
hello_world12
hello_world13
hello_world14
hello_world15
hello_world4
hello_world5

对于上述查询,我​​使用了 ORDER BY NAME; ,但它似乎不是根据数字打印的。

问题陈述:

我想知道我需要在上面的sql查询中编写什么sql查询或需要进行哪些更改,以便它根据数字打印所有内容,因此o / p应该是这样:

hello_world
hello_world4
hello_world5
hello_world10
hello_world11
hello_world12
hello_world13
hello_world14
hello_world15

5 个答案:

答案 0 :(得分:1)

您需要数字排序,然后需要创建一个数字值以进行排序。

当前您有字符串。

如果模式为true,则可以使用字符串操作的组合来修剪掉第一个字符,该字符应仅保留数字,然后使用TO_NUMBER()进行排序

类似

select name 
from mytable
order by to_number( replace( name, 'hello_world','' ))

答案 1 :(得分:1)

对于这种特殊情况(所有值都具有相同的前缀),我认为最简单的解决方案是:

order by length(name), name

答案 2 :(得分:0)

尝试一下:

find_word([a,p,p,_,e], Word).

答案 3 :(得分:0)

我们可以使用replace和cast方法订购它。 我尝试了以下查询

select Name, cast(REPLACE(Name, 'hello_world', '') as UNSIGNED ) as repl from Users order by repl;

生成样本数据

CREATE TABLE Users (
    Name varchar(255) NOT NULL
);

insert into Users(Name) values
('hello_world'),
('hello_world4'),
('hello_world5'),
('hello_world10'),
('hello_world11'),
('hello_world12'),
('hello_world13'),
('hello_world14'),
('hello_world15')
;

编辑 没有替换列的查询,

    select City from Persons order by cast(REPLACE(City, 'hello_world', '') as UNSIGNED );

答案 4 :(得分:-1)

尽管问题是关于mysql的。

我在 sql服务器中尝试过。

create table #t1 (id varchar(100));

insert into #t1 (id) values ('Pq1'),('pq3'),('pq2')

select * from #t 
order by 
CAST(SUBSTRING(id + '0', PATINDEX('%[0-9]%', id + '0'), LEN(id + '0')) AS INT)