Ich habe eine Datenbankspalte, die durch Komma getrennte Werte enthält. Gibt es eine Möglichkeit, die einzelnen Werte aus dieser Spalte in verschiedenen Zeilen zu erhalten, ohne regulären Ausdruck in Oracle zu verwenden.Separate Komma getrennte Werte in Oracle
-2
A
Antwort
0
Hier ist eine SO post, die XML statt regexp_substr verwendet.
Hoffnung, die
EDIT hilft: Für diejenigen, die nicht wollen, dem Link zu folgen, ein einfaches Beispiel wäre:
with testdata as (
select 'a,test,string,for,splitting,values' as col from dual
)
select extractvalue(x.column_value, 'e') as tokens
from testdata, xmltable ('e' passing xmlparse(content '<e>' || replace(col, ',', '</e><e>') || '</e>')) x;
Ausgang:
TOKENS
a
test
string
for
splitting
values
Es Einschränkungen genau wie mit Regexp-Lösung. Bei diesem Ansatz wird regexp jedoch nicht wie angefordert verwendet.
3
Erstellen Sie eine kleine Funktion, die die getrennte Liste zu einer Sammlung umwandelt und dann verwenden, um eine TABLE()
Sammlung Ausdruck sie als separate Zeilen enthalten:
PL/SQL-Funktion:
CREATE OR REPLACE FUNCTION split_String(
i_str IN VARCHAR2,
i_delim IN VARCHAR2 DEFAULT ','
) RETURN SYS.ODCIVARCHAR2LIST DETERMINISTIC
AS
p_result SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
p_start NUMBER(5) := 1;
p_end NUMBER(5);
c_len CONSTANT NUMBER(5) := LENGTH(i_str);
c_ld CONSTANT NUMBER(5) := LENGTH(i_delim);
BEGIN
IF c_len > 0 THEN
p_end := INSTR(i_str, i_delim, p_start);
WHILE p_end > 0 LOOP
p_result.EXTEND;
p_result(p_result.COUNT) := SUBSTR(i_str, p_start, p_end - p_start);
p_start := p_end + c_ld;
p_end := INSTR(i_str, i_delim, p_start);
END LOOP;
IF p_start <= c_len + 1 THEN
p_result.EXTEND;
p_result(p_result.COUNT) := SUBSTR(i_str, p_start, c_len - p_start + 1);
END IF;
END IF;
RETURN p_result;
END;
/
Probe Daten:
CREATE TABLE table_name (id, list) AS
SELECT 1, 'a,b,c,d' FROM DUAL UNION ALL -- Multiple items in the list
SELECT 2, 'e' FROM DUAL UNION ALL -- Single item in the list
SELECT 3, NULL FROM DUAL UNION ALL -- NULL list
SELECT 4, 'f,,g' FROM DUAL; -- NULL item in the list
Abfrage:
SELECT t.id,
v.column_value AS value,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY ROWNUM) AS lvl
FROM table_name t
LEFT OUTER JOIN
TABLE(split_String(t.list)) v
ON (1 = 1)
Ausgang:
ID VALUE LVL
---------- ------- ----------
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
Verwandte Themen
- 1. Regex: Komma getrennte Werte
- 2. Komma getrennte Werte zu IN-Funktion in Oracle
- 3. Split Komma getrennte Werte zu Spalten in Oracle
- 4. SQL-Cursor durch Komma getrennte Werte in Oracle
- 5. Komma-getrennte Werte (CSV) teilen
- 6. Komma getrennte Werte in MySQL "IN" -Klausel
- 7. Komma-getrennte Werte in SQL Server 2008
- 8. Durch Komma getrennte Werte in einem Datenbankfeld
- 9. Komma getrennte Werte in der Aussage SQL
- 10. SQL Komma getrennte Werte dml Operation
- 11. Komma getrennte String-Werte von einem Vektor
- 12. SQL-Auswahlliste als durch Komma getrennte Werte
- 13. MySQL-Abfrage ... WHERE (Komma getrennte Zeichenfolge) IN (Komma getrennte Zeichenfolge)
- 14. Karte Komma getrennte Werte in zwei Spalten in Excel
- 15. Zuordnung über Komma getrennte Werte in Klammern in C
- 16. Split-Funktion in Oracle auf Komma getrennte Werte mit automatischer Sequenz
- 17. Split Komma getrennte Zeichenfolge
- 18. Wie einzelne zitierte Komma getrennte Werte enthält Kommas in Ruby
- 19. Anfügen Linien als Komma getrennte Werte in bash
- 20. Bindung Komma getrennte Werte in eine Datentabelle C#
- 21. Spring Batch - Komma getrennte Werte - Speichern in Datenbank
- 22. MySQL: Vergleiche Komma getrennte Werte mit Werten in verschiedenen Zeilen
- 23. Suche Komma getrennte Werte in Mysql mit PHP
- 24. Komma getrennte Ganzzahl in C#
- 25. Komma getrennte Liste in SQL
- 26. Komma getrennte Liste in PHP
- 27. Oracle: Mehrere durch Komma getrennte Variable-IDs auf Variablenname
- 28. AutoMapper Komma getrennte Zeichenfolge
- 29. Durch Komma getrennte Variablenzuweisung
- 30. Dynamisches Komma Getrennte Zeichenfolge in verschiedene Spalte
Was stimmt nicht mit REGEXP_SUBSTR? – user648026
Natürlich gibt es, verwenden Sie einfach SUBSTR und INSTR (und möglicherweise LÄNGE). Hast du eine Suche gemacht, auch hier auf SO - du solltest viele Beispiele finden. – mathguy
Wenn kein regulärer Ausdruck verwendet wird, ist das 'Regex'-Tag möglicherweise nicht erforderlich. – BriteSponge