我是甲骨文的新手。我遇到了一个问题,例如我需要在两个不同的特殊字符之间获取文本。例如。
txt='$Name:micheal$dept:$sal:$dob:1.0$place:india$'
我需要获取名称和地点。
SELECT SUBSTR(txt, 1 ,INSTR(txt, '$', 1, 1)-1) FROM dual;
---------------------------------------------------------
Name:micheal
我正在超过一个。如何仅获得 ':" 和 '$' 之间的值?帮帮我。我也需要得到印度。
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(, , , occurrence) 解析每个标记
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, '$'))
)
);