una transponer registros multiple filas developer convertir concatenar columns columnas columna auto_increment 11g 10g sql oracle

sql - transponer - Dividir varchar en columnas separadas en Oracle



oracle transponer registros columnas (3)

Estoy en un poco de un lío: me han pedido que reciba comentarios que comiencen con una cadena específica de una base de datos y que separe el resultado en columnas separadas.

Por ejemplo, si un valor devuelto es este:

COLUMN_ONE -------------------- ''D7ERROR username''

El retorno debe ser:

COL_ONE COL_TWO -------------------- D7ERROR username

¿Es incluso posible definir columnas una vez que el conjunto de resultados se ha estructurado solo para dividir una cadena en dos?


Con REGEXP_SUBSTR es tan simple como:

SELECT REGEXP_SUBSTR(t.column_one, ''[^ ]+'', 1, 1) col_one, REGEXP_SUBSTR(t.column_one, ''[^ ]+'', 1, 2) col_two FROM YOUR_TABLE t;


Depende de la consistencia de los datos, asumiendo que un solo espacio es el separador entre lo que desea que aparezca en la columna uno frente a dos:

SELECT SUBSTR(t.column_one, 1, INSTR(t.column_one, '' '')-1) AS col_one, SUBSTR(t.column_one, INSTR(t.column_one, '' '')+1) AS col_two FROM YOUR_TABLE t

Oracle 10g + tiene soporte para expresiones regulares, lo que permite una mayor flexibilidad dependiendo de la situación que necesite resolver. También tiene un método de subscripción de expresiones regulares ...

Referencia:


Forma simple es convertir en columna

SELECT COLUMN_VALUE FROM TABLE (SPLIT (''19869,19572,19223,18898,10155,'')) CREATE TYPE split_tbl as TABLE OF VARCHAR2(32767); CREATE OR REPLACE FUNCTION split (p_list VARCHAR2, p_del VARCHAR2 := '','') RETURN split_tbl PIPELINED IS l_idx PLS_INTEGER; l_list VARCHAR2 (32767) := p_list; l_value VARCHAR2 (32767); BEGIN LOOP l_idx := INSTR (l_list, p_del); IF l_idx > 0 THEN PIPE ROW (SUBSTR (l_list, 1, l_idx - 1)); l_list := SUBSTR (l_list, l_idx + LENGTH (p_del)); ELSE PIPE ROW (l_list); EXIT; END IF; END LOOP; RETURN; END split;