自定义顺序
Custom order by
我需要按文件名的子字符串对结果集进行排序。子字符串是日期。
例如:
select * from mytable where file_name like '%202112%'
order by name_file desc;
结果集例如是这样的:
- qwerty_20211220_120220
- asdfgh_20211229_121005
- 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>
我需要按文件名的子字符串对结果集进行排序。子字符串是日期。
例如:
select * from mytable where file_name like '%202112%'
order by name_file desc;
结果集例如是这样的:
- qwerty_20211220_120220
- asdfgh_20211229_121005
- 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>