如何在oracle中获取两个不同特殊字符之间的文本?

时间:2014-12-04 09:58:15

标签: sql oracle

我是oracle的新手。我遇到了一个问题,比如我需要在两个不同的特殊字符之间获取文本。例如。

txt='$Name:micheal$dept:$sal:$dob:1.0$place:india$'

我需要获得名称和地点。

SELECT SUBSTR(txt, 1 ,INSTR(txt, '$', 1, 1)-1) FROM dual;
---------------------------------------------------------
Name:micheal

我超越了一个。我怎样才能在':'和'$'之间获得价值只有micheal?帮助我。我也需要得到印度。

1 个答案:

答案 0 :(得分:1)

WITH t AS (
  SELECT 1 ID, '$Name:micheal$dept:$sal:$dob:1.0$place:india$' s FROM dual
  /*
  union all
  SELECT 2 ID, '$Name:micheal$dept:$sal:$dob:1.0$place:india$' s FROM dual
  */
)
SELECT ID, regexp_substr(token, '[^:]+', 1, 1) name_
         , regexp_substr(token, '[^:]+', 1, 2) value_
FROM (
  SELECT id, regexp_substr(s, '[^\$]+', 1, lvl) token, lvl
  FROM t JOIN  
  (
    SELECT LEVEL lvl FROM dual 
    CONNECT BY LEVEL < (SELECT MAX(LENGTH(s) - LENGTH(REPLACE(s, '$'))) FROM t)
  ) x ON LENGTH(s) - LENGTH(REPLACE(s, '$')) > lvl
)
order by id, lvl;

1)计算令牌数除以$:LENGTH(s) - LENGTH(REPLACE(s, '$')

2)我为表编写了变体(假设有几行要解析)

3)CONNECT BY LEVEL < max - 在表格中生成从1到最大可能数$的数字

4)使用表格连接数字以使用regexp_substr(,,, occurence)解析每个标记

5)再次解析以拆分名称/值

只解析一个字符串:

SELECT regexp_substr(token, '[^:]+', 1, 1) name_,
       regexp_substr(token, '[^:]+', 1, 2) value_
FROM (
  SELECT regexp_substr(s, '[^\$]+', 1, lvl) token, lvl
  FROM (
    SELECT s, LEVEL lvl FROM (SELECT '$Name:micheal$dept:$sal:$dob:1.0$place:india$' s FROM dual) 
    CONNECT BY LEVEL < LENGTH(s) - LENGTH(REPLACE(s, '$'))
  )
);