2017-04-12 44 views
-2
  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

你怎麼知道哪個'<丹恩WERT =「」>'是進入第Y列?它總是第二個'丹'元素?同樣,列Z總是第三個'dann'元素? – MT0

回答

0

我需要使用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

0

你爲什麼喜歡使用正則表達式?你也可以使用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