我有这个要求
select COALESCE (SUBSTR(description, 0, INSTR(description, '#')-1),description) FROM dual
测试:
时间:description = 123456789 # 11
=>结果= 123456789
时间:description = 123456789
=>结果= 123456789
有没有想法如何减少复杂性,因为你觉得它很难阅读
答案 0 :(得分:2)
要删除#
后第一行中使用regexp_replace的所有字符;
请注意,保留尾随空白。
regexp_replace(description, '([^#]*).*', '\1')
第二行D2
会删除第一行#
或空白
regexp_replace(description, '([^ #]*).*', '\1')
此处示例查询 - 引号仅显示空白的存在:
select
description,
'"'||regexp_replace(description, '([^#]*).*', '\1')||'"' d1,
'"'||regexp_replace(description, '([^ #]*).*', '\1')||'"' d2
FROM
(select '123456789 # 11' description from dual union all
select '123456789' description from dual);
结果
DESCRIPTION D1 D2
-------------- -------------- --------------
123456789 # 11 "123456789 " "123456789"
123456789 "123456789" "123456789"
答案 1 :(得分:1)
您可以使用regexp_substr()
:
select regexp_substr(description, '^[^ #]*[ ]')
我怀疑这会更快。
答案 2 :(得分:0)
我认为这也可以完成这项工作:
select CASE
when INSTR(description, '#') > 0 then
substr(description,0,INSTR(description, '#')-1)
else description
END new_description
FROM dual;
答案 3 :(得分:0)
使用它从描述字段中获取数字部分
SELECT REGEXP_REPLACE('12345678 # 11','[[:alpha:]]') from dual