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

Sql 如何获取oracle中两个不同特殊字符之间的文本?,sql,oracle,Sql,Oracle,我是甲骨文的新手。我遇到了一个问题,比如我需要在两个不同的特殊字符之间获取文本。例如 txt='$Name:micheal$dept:$sal:$dob:1.0$place:india$' 我需要知道名字和地点 SELECT SUBSTR(txt, 1 ,INSTR(txt, '$', 1, 1)-1) FROM dual; --------------------------------------------------------- Name:micheal 我快超过一岁了。如何仅在“

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

txt='$Name:micheal$dept:$sal:$dob:1.0$place:india$'
我需要知道名字和地点

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

我快超过一岁了。如何仅在“:”和“$”之间获取值?帮我做这件事。我还需要去印度。

成功了。非常感谢。但为什么重复两次?@CrazeaboutLife我以为你有一张有几行的桌子。如果您只有一个字符串,则可以更轻松地完成此操作(无需加入)。@CrazeaboutLife我只为一个字符串(不是表)添加了一个查询
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;
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, '$'))
  )
);