unir una texto separar separadas quitar por otra dividir desactivar delimitador datos como coma columnas columna celda postgresql split delimiter postgresql-8.4

postgresql - una - Divida los datos de columna separados por comas en columnas adicionales



separar texto en columnas access (3)

Puedes usar la función dividida.

SELECT (select top 1 item from dbo.Split(FullName,'','') where id=1 ) Column1, (select top 1 item from dbo.Split(FullName,'','') where id=2 ) Column2, (select top 1 item from dbo.Split(FullName,'','') where id=3 ) Column3, (select top 1 item from dbo.Split(FullName,'','') where id=4 ) Column4, FROM MyTbl

Tengo datos separados por comas en una columna:

Column ------- a,b,c,d

Quiero dividir los datos separados por comas en varias columnas para obtener esta salida:

Column1 Column2 Column3 Column4 ------- ------- ------- ------- a b c d

¿Cómo se puede lograr esto?


Si el número de campos en el CSV es constante, entonces podría hacer algo como esto:

select a[1], a[2], a[3], a[4] from ( select regexp_split_to_array(''a,b,c,d'', '','') ) as dt(a)

Por ejemplo:

=> select a[1], a[2], a[3], a[4] from (select regexp_split_to_array(''a,b,c,d'', '','')) as dt(a); a | a | a | a ---+---+---+--- a | b | c | d (1 row)

Si el número de campos en el archivo CSV no es constante, entonces puede obtener la cantidad máxima de campos con algo como esto:

select max(array_length(regexp_split_to_array(csv, '',''), 1)) from your_table

y luego construya la lista de columnas a[1], a[2], ..., a[M] apropiada para su consulta. Entonces, si lo anterior le dio un máximo de 6, usaría esto:

select a[1], a[2], a[3], a[4], a[5], a[6] from ( select regexp_split_to_array(csv, '','') from your_table ) as dt(a)

Puede combinar esas dos consultas en una función si lo desea.

Por ejemplo, proporcione esta información (que es NULL en la última fila):

=> select * from csvs; csv ------------- 1,2,3 1,2,3,4 1,2,3,4,5,6 (4 rows) => select max(array_length(regexp_split_to_array(csv, '',''), 1)) from csvs; max ----- 6 (1 row) => select a[1], a[2], a[3], a[4], a[5], a[6] from (select regexp_split_to_array(csv, '','') from csvs) as dt(a); a | a | a | a | a | a ---+---+---+---+---+--- 1 | 2 | 3 | | | 1 | 2 | 3 | 4 | | 1 | 2 | 3 | 4 | 5 | 6 | | | | | (4 rows)

Como su delimitador es una cadena fija simple, también puede usar string_to_array lugar de regexp_split_to_array :

select ... from ( select string_to_array(csv, '','') from csvs ) as dt(a);

Gracias a Michael por el recordatorio sobre esta función.

Realmente debería rediseñar su esquema de base de datos para evitar la columna CSV si es posible. En su lugar, debería usar una columna de matriz o una tabla separada.


split_part() hace lo que quieres en un solo paso:

SELECT split_part(col, '','', 1) AS col1 , split_part(col, '','', 2) AS col2 , split_part(col, '','', 3) AS col3 , split_part(col, '','', 4) AS col4 FROM tbl;

Agregue tantas líneas como elementos tenga en col (el máximo posible). Las columnas que excedan los elementos de datos serán cadenas vacías ( '''' ).