REGEXP_SUBSTR oracle 11g

时间:2016-06-24 15:49:10

标签: sql regex oracle oracle11g

所有

我的输入数据有以下格式,

"CUStid":["201","217"],"HireDate":"2016-06-24","EndDate":"2016-08-23"

(或)

"CUStid":["301",""],"HireDate":"2016-06-24","EndDate":"2016-08-23"

我需要输入输入数据中的客户ID,当我运行以下内容时,它返回null

(REGEXP_SUBSTR (inputdata,
                                '"CUStid":"([^"]*)"',
                                1,
                                1,
                                NULL,
                                1))

预期输出为:

CUStid1   Custid2  

201         217  

301       

有人可以告诉我如何在oracle 11g中执行此操作

由于

2 个答案:

答案 0 :(得分:1)

使用

REGEXP_SUBSTR (inputdata,'"CUStid":"\[(.+)\]"',1,1,null,1)

[]应使用\进行转义。

获取"301","""201","217"

使用字符串操作将多个值作为单独的列获取。

如果最多可以使用,使用

分隔2个值
select 
 substr(replace(val,'"',''), 1, instr(replace(val,'"',''),',')-1) custid1
,substr(replace(val,'"',''), instr(replace(val,'"',''),',')+1) custid2
from (select REGEXP_SUBSTR (inputdata,'"CUStid":"\[(.+)\]"',1,1,null,1) val
      from tablename) 

答案 1 :(得分:0)

快速回答是,在您的搜索模式中,您错过了[。 它应该是:

'"CUStid":["([^"]*)"'(注意冒号[后面的:

...实际上(TESTING HELPS!)[是正则表达式中的元字符,因此必须对其进行转义:

'"CUStid":\["([^"]*)"'

更长的答案是你需要能够获得第二个客户ID,但也许你已经知道如何做到这一点。祝你好运!

已修改

以下是完整查询:

with inputs (inputdata) as (
   select '"CUStid":["201","217"],"HireDate":"2016-06-24","EndDate":"2016-08-23"' from dual
       union all
   select '"CUStid":["301",""],"HireDate":"2016-06-24","EndDate":"2016-08-23"' from dual
  )
select regexp_substr(inputdata, '"CUStid":\["([^"]*)"', 1, 1, null, 1) as custid1,
       regexp_substr(inputdata, '"CUStid":\["[^"]*","([^"]*)"', 1, 1, null, 1) as custid2
from   inputs;

结果:

CUSTID1    CUSTID2
---------- ----------
201        217
301

2 rows selected.