2016-09-16 4 views
0

Ich bin mit Oracle 11g, ich habe eine SQL-Abfrage, die einen String-Typen result_column mit der folgenden Formatierung von Text zurück (es ist eine Verkettung über die listagg Funktion erhalten) hinzufügen:html-Tag in SQL-Abfrage Ergebnis

aaa, bbbbbbb, cc, dDDDDDDDDD

ich weiß nicht, die Anzahl der „Operanden“, es kann 2, 3, 4 oder sogar mehr ...

ich das Ergebnis formatieren, um den abwechselnden Farben in HTML möchten, also möchte ich die Ergebnisspalte in folgendes transformieren:

<font color="red">aaa,</font> <font color="green">bbbbbbb,</font> <font  color="red">cc,</font> <font color="green">dddddddddd</font> 

ist das möglich? (Über reguläre Ausdrücke vielleicht?)

Im Voraus vielen Dank für jeden Tipp können Sie

Mit freundlichen Grüßen Jam

+0

Tag die dbms Sie verwenden. (Die Antwort kann produktspezifisch sein.) – jarlh

+0

fertig danke! es ist Orakel 11g – JamDak

Antwort

0

Hier ist eine Möglichkeit geben, obwohl es ziemlich klobig ist (es muss sowohl eine REGEXP_REPLACE und ersetzen ein normal):

WITH sample_data AS (SELECT 'aaa, bbbbbbb, cc, dddddddddd' str FROM dual UNION ALL 
        SELECT 'aaa' str FROM dual UNION ALL 
        SELECT 'aaaa, bbbbbbb' str FROM dual UNION ALL 
        SELECT 'aa, bbbbbb, ccc' str FROM dual UNION ALL 
        SELECT 'aaaa, b, ccc, dddd' str FROM dual) 
SELECT str, 
     replace(regexp_replace(str, 
           '(?)([^,]+)(,|$) ?([^,]*)(,|$)', 
           '\1<font color="red">\2\3</font> <font color="green">\4\5</font>'), 
       '<font color="green"></font>') new_str 
FROM sample_data; 

STR       NEW_STR 
---------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
aaa, bbbbbbb, cc, dddddddddd <font color="red">aaa,</font> <font color="green">bbbbbbb,</font> <font color="red">cc,</font> <font color="green">dddddddddd</font> 
aaa       <font color="red">aaa</font> 
aaaa, bbbbbbb    <font color="red">aaaa,</font> <font color="green">bbbbbbb</font> 
aa, bbbbbb, ccc    <font color="red">aa,</font> <font color="green">bbbbbb,</font> <font color="red">ccc</font> 
aaaa, b, ccc, dddd   <font color="red">aaaa,</font> <font color="green">b,</font> <font color="red">ccc,</font> <font color="green">dddd</font> 

Grundsätzlich ist diese sucht nach dem Muster, in dem wir haben 0 oder 1 ist durch eine beliebige Anzahl von nicht-komma~~POS=TRUNC gefolgt Leerzeichen, gefolgt von entweder einem Komma oder dem Ende der Zeile. Dies könnte dann von einem ähnlichen Muster gefolgt werden oder nicht (daher das * in der zweiten Hälfte des Regexp-Musters gegenüber dem + in der ersten Hälfte), da wir eine ungerade Anzahl von Elementen in der Kette haben könnten.

Dann ersetzt er die Elemente in den Klammern im Suchmuster (jedes Klammerelement kann durch \ N bezeichnet werden, wobei N sein Auftreten in der Musterzeichenfolge ist) an den relevanten Stellen.

Schließlich, um die Tatsache zu berücksichtigen, dass ungerade Elemente eine nachlaufende <font color="green"></font> hinterlassen, müssen wir das abziehen - daher die äußere replace.

Ich würde wetten, dass es jedoch effizientere Lösungen gibt!

+0

Vielen Dank Boneist! das hat wie ein charm + nette erklärung funktioniert, ich konnte ein bisschen mit der regexp_replace funktion spielen, danke nochmal! – JamDak

0

In der Theorie kann es ganz einfach getan werden, wenn die Anzahl der Werte endlich ist, sagen wir maximal 10. Es ist nicht schön (in der Tat ist es ziemlich hässlich;), aber es funktioniert. Ersetzen

([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)? 

mit

<font color="red">\1</font> <font color="green">\2</font> <font color="red">\3</font> <font color="green">\4</font> <font color="red">\5</font> <font color="green">\6</font> <font color="red">\7</font> <font color="green">\8</font> <font color="red">\9</font> <font color="green">\10</font> 

See it here at regex101.

Und ein JavaScript-Snippet zu veranschaulichen.

var regex = /([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?([^,]*,?)?/, 
 
    repl = '<font color="red">$1</font> <font color="green">$2</font> <font color="red">$3</font> <font color="green">$4</font> <font color="red">$5</font> <font color="green">$6</font> <font color="red">$7</font> <font color="green">$8</font> <font color="red">$9</font> <font color="green">$10</font>', 
 
    input = 'aaa, bbbbbbb, cc, dddddddddd'; 
 

 
document.getElementById('output').innerHTML = input.replace(regex, repl);
<div id="output"/>

+0

Danke ClasG! – JamDak