Oracle SQL:正则表达式 - 从行中检索特定字符

问题描述:

  1. 我有这个列有超过300行的列(如下所示),我需要在select语句中使用正则表达式中的一个来检索(在不同的列)执行以下操作:
  2. MisTop50RankingTop50CCP & MisScLeDivProfit作为列X
  3. TUKB901作为第Y列
  4. 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> 
    

任何想法,将有很大的帮助

谢谢

+0

你怎么知道哪个''是进入第Y列?它总是第二个'丹'元素?同样,列Z总是第三个'dann'元素? – MT0

我需要使用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' 
); 
+0

谢谢你的回答 – John

+0

但是我需要使用REGEXP_SUBSTR,因为它是更大选择的一部分,这是客户想要的 – John

+0

你确定要使用NATURAL JOIN而不是'CROSS JOIN'或'LEFT OUTER JOIN XMLTABLE(...)ON(1 = 1)'? – MT0