从现有的列(substring或regexp)创建一个新的修改列

时间:2017-01-17 16:51:45

标签: sql oracle

在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

3 个答案:

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