【问题标题】:Custom order by自定义订单
【发布时间】:2021-12-31 16:33:39
【问题描述】:

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

例如:

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中包含的部分字符串日期如何排序?

谢谢大家

【问题讨论】:

  • 格式是否总是准确的[some_text]_YYYYMMDD_HH24MISS

标签: sql oracle sql-order-by


【解决方案1】:

您需要编写一个从字符串中提取日期的表达式,然后在您的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;

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

【讨论】:

  • @dnlnfr PL/SQL 是数据库内编译的编程语言。上面的解决方案是Oracle SQL。
【解决方案2】:

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

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>

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2014-08-13
    • 2015-12-09
    • 2019-05-24
    • 2017-06-12
    相关资源
    最近更新 更多