Oracle SQL:正则表达式 - 从行中检索特定字符
问题描述:
- 我有这个列有超过300行的列(如下所示),我需要在select语句中使用正则表达式中的一个来检索(在不同的列)执行以下操作:
- MisTop50RankingTop50CCP & MisScLeDivProfit作为列X
- TUKB901作为第Y列
-
PA_T50_TOP50 & PA_SC_LE_DIV作为列以ZOracle SQL:正则表达式 - 从行中检索特定字符
<regel><wenn wert="MisTop50RankingTop50CCP" /><dann wert="T50" /><dann wert="TUKB901" /><dann wert="PA_T50_TOP50" /><dann wert="TUKB203" /><dann wert="T_T50_TOP50" /><dann wert="STICHTAG" /><dann wert="CCP" /><dann wert=" " /><dann wert=" " /><dann wert="1" /><dann wert=" " /><dann wert=" " /><prio wert="50"/></regel> <regel><wenn wert="MisScLeDivProfit" /><dann wert="SC" /><dann wert="TUKB901" /><dann wert="PA_SC_LE_DIV" /><dann wert="TUKB201" /><dann wert="T_SC_LE_DIV" /><dann wert="STICHTAG_MANDANT_LAUF" /><dann wert=" " /><dann wert=" " /><dann wert=" " /><dann wert="1" /><dann wert=" " /><dann wert=" " /><prio wert="50"/></regel>
任何想法,将有很大的帮助
谢谢
答
我需要使用REGEXP_SUBSTR因为将成为其中的一部分更大的选择,这是客户想要的
真的,do not use regular expressions to parse XML并使用正确的XML解析器。
如果你的任务是对所有重要意义:
SELECT REGEXP_SUBSTR(rule, '<wenn\s+wert\s*=\s*"(.*?)"\s*/>', 1, 1, NULL, 1) AS X,
REGEXP_SUBSTR(rule, '<dann\s+wert\s*=\s*"(.*?)"\s*/>', 1, 2, NULL, 1) AS Y,
REGEXP_SUBSTR(rule, '<dann\s+wert\s*=\s*"(.*?)"\s*/>', 1, 3, NULL, 1) AS Z
FROM your_table;
+0
非常感谢!这是工作,并节省我的屁股大时间 – John
答
你为什么喜欢使用正则表达式?你也可以使用XML功能来做到这一点。假设各行应返回一条记录,你可以用这一个:
WITH x AS (
SELECT XMLTYPE('<regel><wenn wert="MisTop50RankingTop50CCP" /><dann wert="T50" /><dann wert="TUKB901" /><dann wert="PA_T50_TOP50" /><dann wert="TUKB203" /><dann wert="T_T50_TOP50" /><dann wert="STICHTAG" /><dann wert="CCP" /><dann wert=" " /><dann wert=" " /><dann wert="1" /><dann wert=" " /><dann wert=" " /><prio wert="50"/></regel>') AS regel
FROM dual)
SELECT WENN AS X,
DANN_1 AS Y,
DANN_3 AS Z
FROM x
NATURAL JOIN XMLTABLE('/regel' PASSING regel COLUMNS
WENN VARCHAR2(100) PATH 'wenn/@wert',
DANN_1 VARCHAR2(100) PATH 'dann[1]/@wert',
DANN_3 VARCHAR2(100) PATH 'dann[3]/@wert'
);
X Y Z
MisTop50RankingTop50CCP T50 PA_T50_TOP50
在你情况下,可能看起来像这样:
SELECT WENN AS X,
DANN_1 AS Y,
DANN_3 AS Z
FROM YOUR_TABLE
NATURAL JOIN XMLTABLE('/regel' PASSING XMLTYPE(RULE) COLUMNS
WENN VARCHAR2(100) PATH 'wenn/@wert',
DANN_1 VARCHAR2(100) PATH 'dann[1]/@wert',
DANN_3 VARCHAR2(100) PATH 'dann[3]/@wert'
);
你怎么知道哪个''是进入第Y列?它总是第二个'丹'元素?同样,列Z总是第三个'dann'元素? – MT0