下面的解决方案,使用regexp_replace(),找到模式“破折号,四位数,正斜杠,两位数,正斜杠,两位数,空格,两位数,冒号,两位数,冒号,两位数”,并且如果找到它,它会将它和所有剩余的(后续)字符删除到字符串的末尾。它不验证“日期”(它不检查它是否是有效的日期时间字符串)。如果未找到该模式,则该函数返回原始字符串,保持不变。
注意函数的最后一个参数'n'。当输入字符串包含换行符时(不太可能,但可能)情况就是这样。通常,点. 作为通配符与换行符不匹配; 'n' 修饰符改变了这种行为,允许点也匹配换行符。
with
test (col) as (
select 'TEST-01-2019/10/10 01:01:20' from dual union all
select 'something else-goes here-2019/08/30 12:33:00' from dual union all
select 'TEST/01-2019/10/10 01:01:20' from dual union all
select 'TEST_01-2019/10/10 01:01:20' from dual union all
select 'TEST-01' from dual
)
select col,
regexp_replace(col, '-\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}.*',
null, 1, 1, 'n') as result
from test
;
COL RESULT
-------------------------------------------- ------------------------------
TEST-01-2019/10/10 01:01:20 TEST-01
something else-goes here-2019/08/30 12:33:00 something else-goes here
TEST/01-2019/10/10 01:01:20 TEST/01
TEST_01-2019/10/10 01:01:20 TEST_01
TEST-01 TEST-01
编辑:这是一个仅使用标准字符串函数的解决方案,因此可能比任何使用正则表达式的解决方案都更快(并且可能明显如此)。
select col,
case when translate(col, '123456789', '000000000')
like '%-0000/00/00 00:00:00%'
then substr(col, 1, instr(translate(col, '123456789', '000000000'),
'-0000/00/00 00:00:00') - 1)
else col
end as result
from test
;