如何减少这个请求的复杂性

时间:2016-02-14 14:50:51

标签: sql oracle

我有这个要求

select COALESCE (SUBSTR(description, 0, INSTR(description, '#')-1),description) FROM dual

测试:

时间:description = 123456789 # 11 =>结果= 123456789

时间:description = 123456789 =>结果= 123456789

有没有想法如何减少复杂性,因为你觉得它很难阅读

4 个答案:

答案 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