【发布时间】:2015-09-20 08:02:38
【问题描述】:
我在表中有某些具有不同 XML 结构的值。
有一个标签<problemDesc> 'error' </problemDesc>
它存在于所有 XML 块中。
如何使用 SubStr 和 InStr 函数从标签中提取错误?或者有没有办法获得价值。
【问题讨论】:
我在表中有某些具有不同 XML 结构的值。
有一个标签<problemDesc> 'error' </problemDesc>
它存在于所有 XML 块中。
如何使用 SubStr 和 InStr 函数从标签中提取错误?或者有没有办法获得价值。
【问题讨论】:
使用字符串函数解析 XML 不是一个好主意。改用内置的 XML 解析功能:
select *
FROM
XMLTABLE('//problemDesc'
PASSING
xmltype('<problemDesc>error</problemDesc>')
COLUMNS
error varchar2 (200) PATH '.'
) xmlt
;
【讨论】:
虽然我同意这是一个坏主意,但以您提出的类似问题的方式回答问题是可行的:
SELECT SUBSTR('<problemDesc>Error 1</problemDesc>',
INSTR('<problemDesc>Error 1</problemDesc>', '<problemDesc>') + LENGTH('<problemDesc>'),
INSTR('<problemDesc>Error 1</problemDesc>', '</problemDesc>') - (INSTR('<problemDesc>Error 1</problemDesc>', '<problemDesc>') + LENGTH('<problemDesc>')))
FROM DUAL;
换句话说
SELECT SUBSTR(COL_NAME,
INSTR(COL_NAME, '<problemDesc>') + LENGTH('<problemDesc>'),
INSTR(COL_NAME, '</problemDesc>') - (INSTR(COL_NAME, '<problemDesc>') + LENGTH('<problemDesc>')))
FROM SOME_TABLE;
这只有在这些标签不出现多次时才有效。但是,理论上您正在寻找 START 标签的开头,并且想要转到 END 标签的开头。
【讨论】:
为什么要进行字符串操作?? 试试这个:
SQL> select extractvalue(xmltype('<a>abhi</a>'),'//a/text()') from dual;
EXTRACTVALUE(XMLTYPE('<A>ABHI<
--------------------------------------------------------------------------------
abhi
【讨论】: