Sql 按字符串和整数排序

Sql order by string and int

我有 table 列天数,这个天数值是这样的:

day 1
day 2
day 3
day 4
...
day n

在我的数据库中,这些行没有排序,所以我想检索它按字符串后的 int 排序: 例如我有

day 2
day 4
day 1
day 3

=> 得到

day 1
day 2
day 3
day 4

更改列类型和值是最佳选择,但如果有检索它的选项,我想使用此结构。

应该有效:

select * from orderby  order by day asc

编辑:

抱歉,我没有注意到它的字符串 + 整数:

修复了我的代码:

select * from orderby order by convert(int, replace(sdate, 'day ', '')) asc

orderby 子句可以按顺序使用 col 和 right 函数。

select * from tablename order by right(day,2) asc

将天数从 1 跳到最大值 99 ... 如果更多,也许可以查看天数和数字之间的 space 可能是另一种方式。

select a, CAST(substring(a from '\d+$') as int) Num from test_tbale order by Num;

结果

 Day 0 | 0
 Day 1 | 1
 Day 3 | 3
 Day 4 | 4
 Day 5 | 5
 Day 7 | 7

当前数据

select * from test_table;
   a
-------
 Day 3
 Day 4
 Day 5
 Day 7
 Day 0
 Day 1

Postgres

使用 split_part

的结果相同
select a, split_part(a , ' ', 2)::int Num from test_table order by Num;

   a   | num
-------+-----
 Day 0 | 0
 Day 1 | 1
 Day 3 | 3
 Day 4 | 4
 Day 5 | 5
 Day 7 | 7

完整示例

create table test_table(a text);
insert into test_table select 'Day ' || floor(random()*100 +1)::text from generate_series(1,10);

select * from test_table;
   a
--------
 Day 19
 Day 87
 Day 86
 Day 34
 Day 50
 Day 97
 Day 84
 Day 81
 Day 67
 Day 6


select a, CAST(substring(a from '\d+$') as int) Num from test_table order by Num;
   a    | num
--------+-----
 Day 6  |   6
 Day 19 |  19
 Day 34 |  34
 Day 50 |  50
 Day 67 |  67
 Day 81 |  81
 Day 84 |  84
 Day 86 |  86
 Day 87 |  87
 Day 97 |  97

对于MySql 8

select a ,CAST(REGEXP_SUBSTR(a, '[0-9]+$') as UNSIGNED) Num from test_table order by Num;

MySql 没有 REGEXP_SUBSTR

select a ,CAST(SUBSTRING(a, 4) as UNSIGNED) Num from test_table order by Num;