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;