自定义顺序

Custom order by

我需要按文件名的子字符串对结果集进行排序。子字符串是日期。

例如:

select * from mytable where file_name like '%202112%'
order by name_file desc;

结果集例如是这样的:

  1. qwerty_20211220_120220
  2. asdfgh_20211229_121005
  3. zxcvbn_20211223_121151

如何按 name_file 中包含的字符串日期的一部分进行排序?

感谢大家

您需要编写一个从字符串中提取日期的表达式,然后在 ORDER BY.

中使用该表达式

使用您的样本数据,一个简单的方法可能是:

select * from files
order by substr(file_name,-15);

即按文件名的最后 15 个位置(即日期)排序。

如果您使用的是 12.2 或更高版本,您可以使用此方法做得更好:

select * from files
order by to_date(substr(file_name,-15) 
             default null on conversion error,'YYYYMMDD"_"HH24MISS') nulls last;

这将确保您排序的数据是实际日期。最后一个没有日期戳的文件名将排在最后。

或者,按“日期”排序(由第一组数字表示):

SQL> select *
  2  from mytable
  3  order by regexp_substr(file_name, '\d+');

FILE_NAME
----------------------
qwerty_20211220_120220
zxcvbn_20211223_121151
asdfgh_20211229_121005

或者,按第一个下划线字符后的 任何内容 排序:

SQL> select *
  2  from mytable
  3  order by substr(file_name, instr(file_name, '_'));

FILE_NAME
----------------------
qwerty_20211220_120220
zxcvbn_20211223_121151
asdfgh_20211229_121005

SQL>