2017-04-19 65 views
0

使用Oracle 11.我们需要删除一个分号和任何在一组字符串中的分号右侧的分号。仅显示特殊字符左侧的字符

该字符串可能包含也可能不包含分号。如果没有分号,我们将返回整个字符串。

我可以看到使用CASE来改变字符串只有当有一个分号时,但肯定是语法去处理分号和分号后面的所有内容。

字符串

123456;789154将返回123456

123456789将返回123456789

Case 
When string1 like ('%;%') 
     then substr(…….) or trim(…) 

Else string1 

End 
As trimmedstring 

任何和所有帮助/指针赞赏

+2

看看[INSTR ](https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions068.htm) – abhi

+0

如果字符串中有多个分号,该怎么办?你需要从第一个分号开始删除任何东西吗? – Aleksej

+0

在数据集中,只会有一个,但是如果数据集发生更改,我们希望从第一个下一个中删除所有。 – user761758

回答

3

假设你要删除任何东西从第一开始字符串中的分号,这可能是一种方法:

with test(s) as (
    select '123456;789154' from dual union all 
    select '123456;789154;567' from dual union all 
    select '123456789' from dual 
) 
select s, 
     case 
     when instr(s, ';') = 0 then s 
     else substr(s, 1, instr(s, ';')-1) 
     end 
from test 

使用正则表达式,你可以得到相同的结果更紧凑,但效率较低的方式,具有:

regexp_substr(s, '[^;]*') 
+0

完美!谢谢.. – user761758

-1

试试这个:

Select LEFT(Name, Case 
     WHEN CHARINDEX(';', Name) = 0 
     then Len(Name) 
      else CHARINDEX(';', Name)-1 END) from CustomerDetails 
+0

left&charindex不是Oracle的属性。 – user761758