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!
Tag die dbms Sie verwenden. (Die Antwort kann produktspezifisch sein.) – jarlh
fertig danke! es ist Orakel 11g – JamDak