在Oracle SQL中寻找最佳方法在查询中创建新列,我将其删除&在最后一个正斜杠“/".
之后忽略任何字符我将使用case语句创建新列(NEW_COL_1),但不确定过滤文本FROM COL1的最佳方法。见下面的例子
Col_1 | New_Col_1
---------------------
abc/ab | abc
a1/a1 | a1
a1/a1/a2| a1/a1
efg/a1/z| efg/a1
答案 0 :(得分:1)
如果没有正则表达式,您可以使用:
var christmasMorning = new DateTime(2016, 12, 25, 8, 15, 0);
christmasMorning.ToString("yyyy-MM-ddTHH\\:mm\\:ss"); // 2016-12-25T08:15:00
给出:
with test(s) as (
select 'abc/ab ' from dual union all
select 'a1/a1 ' from dual union all
select 'a1/a1/a2' from dual union all
select 'efg/a1/z' from dual union all
select 'efg' from dual /* no slash in the string */
)
select s, substr(s, 1,
case /* to handle the case no slash exists in the string */
when instr(s, '/', -1) = 0 then length(s)
else instr(s, '/', -1) -1
end
)
from test
INSTR
用于查找斜杠的最后一次出现(-1参数),子串只是根据需要修剪字符串。
根据Mathguy的建议,这可以用以下更紧凑的方式重写:
abc/ab abc
a1/a1 a1
a1/a1/a2 a1/a1
efg/a1/z efg/a1
efg efg
这里的想法是,如果字符串中至少有一个斜杠,则只调用函数,如果没有斜杠,只需返回字符串。
答案 1 :(得分:0)
使用regexp_substr
进行此操作的一种方法。
select regexp_substr(col_1,'(.*)/.*$',1,1,null,1) as new_col_1
from tablename
where instr(col_1,'/') > 0
(.*)/.*$
- 获取所有字符,直到字符串中的最后一个/
作为第一个组并将其解压缩。
答案 2 :(得分:0)
或使用常规字符串函数; instr获得第一个位置/向后计数:
with data as
( select 'abc/ab' as col1 from dual union all
select 'a1/a1' as col1 from dual union all
select 'a1/a1/a2' as col1 from dual union all
select 'efg/a1/z' as col1 from dual
)
select col1, instr( col1, '/',-1 ), substr( col1, 1, instr( col1, '/', -1 ) -1 ) from data
结果:
COL1 INSTR(COL1,'/',-1) SUBSTR(COL1,1,INSTR(COL1,'/',-1)
-------- ------------------ --------------------------------
abc/ab 4 abc
a1/a1 3 a1
a1/a1/a2 6 a1/a1
efg/a1/z 7 efg/a1