2017-02-09 4 views
-1

Ich habe eine Spalte in einer Tabelle, wo die Daten gespeichert sind in folgenden FormatMöchten Sie den einen Text von einem Tag

<Server start> 
    <message tagid=" ">false</message> 
    <message tagid="34">no data found</message> 
    <message tagid=" ">false</message> 
    <Server stop> 

Wo ich brauche zu extrahieren „keine Daten gefunden“ extrahieren. Erprobt mit regexp Replace-Funktion, aber konnte es nicht in der richtigen Weise machen.

Hinweis: Die Nachrichten-ID (Nummer) kann beliebig lang sein.

+0

Können Sie uns zeigen, wie die Tabelle und Daten tatsächlich aussieht? – BobC

+0

Wirklich? Müssen Sie "keine Daten gefunden" extrahieren, egal wo? Dann wählen Sie einfach 'keine Daten gefunden' aus ... 'OK, das ist also ** nicht ** die Voraussetzung, oder? Was müssen Sie extrahieren - die Nachricht, wo das Tagid kein einzelnes Leerzeichen ist? Was ist, wenn es mehr als eine solche Nachricht gibt? – mathguy

+0

@mathguy die Nachricht wird dynamisch ausgefüllt, so konnte ich nicht direkt mit Select extrahieren. Als nächstes kann es mehrere Nachrichtstagids geben, aber nur einer Tag-ID wird eine Nummer bzw. eine Nachricht zugewiesen. Also muss ich das Tagid finden, das eine Nummer enthält. – user3928562

Antwort

0

Versuchen Sie, Ihre Abfrage basierend auf dem folgenden Code zu erstellen. Zunächst Ihren Text in XML konvertieren, dann neccesary Daten extrahieren, indem XMLType.extract() -Funktion

with test_query as (select XMLType(replace(replace(s,'<Server stop>','</Server>'),'<Server start>','<Server>')) xml from 
(select '<Server start> 
    <message tagid=" ">false</message> 
    <message tagid="34">no data found</message> 
    <message tagid=" ">false</message> 
    <Server stop>' as s from dual)) 
    select 
     t.xml.extract('//message[position()=2]/text()') out 
    from test_query t; 
+0

tatsächlich Position der Nachricht tagid, die Fehlercode enthält, ist nicht behoben. Zum Beispiel kann es auf der 2. Position für die ID 1 erscheinen, es kann auf der 5. Position für die ID 2 und der 1. Position für die ID 3 erscheinen. Wir benötigen grundsätzlich eine Abfrage, die den Fehlertext unabhängig von der Nachrichten-Tagid-Position extrahieren kann. Glauben Sie, dass regex_replace das lösen kann? – user3928562

+0

Wenn Sie nicht wissen, genaue Position ersetzen in meiner Abfrage t.xml.extract ('// Nachricht [Position() = 2]/text()') von t.xml.extract ('// Nachricht [@ tagid! = ""]/text() ') out – Jgrammer

1

Abfrage:

SELECT x.tagid, 
     x.message 
FROM your_table t 
     CROSS JOIN 
     XMLTable(
     '/Server/message' 
     PASSING XMLType(
        REPLACE(
        REPLACE(t.your_column, '<Server start>', '<Server>'), 
        '<Server stop>', 
        '</Server>' 
        ) 
       ) 
      COLUMNS tagid VARCHAR2(100) PATH './@tagid', 
        message VARCHAR2(400) PATH './text()' 
     ) x; 

Ausgabe

TAGID MESSAGE 
----- ------- 
     false 
34 no data found 
     false 

Wenn Sie nur Wollen Sie die Werte, wo die Nachricht ist no data found dann fügen Sie eine WHERE cla hinzu Verwenden Sie am Ende der Abfrage:

WHERE x.message = 'no data found'; 
+0

Oder eher, aus dem OP-Kommentar unter der Frage, wo tagid nicht null ist. Oder vielleicht! = ''. – mathguy

Verwandte Themen