【发布时间】:2018-05-14 11:04:43
【问题描述】:
我有一个 SQL 存储在其中日期格式在方括号中的列中:
sql_column
------------------------------------------------------------------------------
select col1 from table1 where col2 = to_date('[DD-MON-YYYY]', 'DD-MON-YYYY');
select col1 from table2 where col2 between [YYYYMMDD]00000 and [YYYYMMDD]99999 and col3 = to_date('[DD-MON-YYYY]', 'DD-MON-YYYY');
....
我不知道事先可以有哪种格式,但它始终是日期格式。
有没有办法使用 regexp_replace(或 regexp_substr 甚至与 regexp_* 函数)来查找模式并将其替换为我给定日期的 to_char 的结果和从 db 列中获取的模式。
可能是这样的(显然不起作用):
select sql_column,
regexp_replace(sql_column, '\[(.+?)\]', to_char(some_date, '\1'))
from my_table;
你能帮忙吗?
【问题讨论】:
-
按照这个
select sql_column, regexp_substr(sql_column, '\[(.+?)\]', 1, 1, NULL, 1) as new_format, regexp_replace(sql_column, '\[(.+?)\]', '[' || to_char(some_date, new_format) || ']') from my_table;结果如何? -
@revo - 我试过
regexp_replace(sql_column, '\[(.+?)\]', '[' || to_char(date'2016-06-01', '\1') || ']'),它不起作用 - 给出错误ORA-01821: date format not recognized。 -
您的错误是关于日期格式的尝试修复它。
-
这个日期格式需要来自正则表达式的反向引用
-
您无法使用 REGEXP_* 函数捕获格式模型并将其用于同一 REGEXP_* 函数中对 TO_DATE 的调用。您似乎还有未指定数量的日期需要更换;这意味着您将需要某种递归查询(可能是递归 CTE)来从模板和正确数量的输入(绑定变量或您传入的任何其他内容)构造正确的 SQL 语句。那么,显而易见的问题是:为什么 SQL 语句以这种方式存储,而不是应有的视图?
标签: sql regex oracle backreference