Estoy tratando de ver si puedo crear una tabla relacional a partir de una tabla por etapas creada a partir de un archivo semiestructurado que tiene una columna de tipo de datos variante.

La intención es crear una tabla relacional con columnas individuales de cada uno de los elementos bajo una matriz de datos JSON. Por ejemplo, si mis datos son algo así:

{servicio: [{tipo: 1, valor: 300},

{tipo: 2, valor: 400}]}

Me gustaría crear una tabla con 2 columnas como se muestra a continuación con los siguientes valores:

TYPE_1_VAL = 300

TYPE_2_VAL = 400

Esencialmente, mi consulta de inserción debe basarse en una condición al insertar datos en estas dos columnas. En este caso,

 INSERT 100 INTO TYPE_1_VAL if type=1 

Y así sucesivamente.

Sé que podemos usar el aplanamiento lateral para crear 2 filas / columnas, pero estoy buscando ver si el enfoque mencionado anteriormente es posible o no.

TYPE VALUE

1 300

2 400
0
Rachel McGuigan 13 dic. 2019 a las 23:19

2 respuestas

La mejor respuesta

¿Estás tratando de evitar el aplanamiento? De lo contrario, puede crear una vista (materializada, si es necesario) sobre la tabla que tiene sus datos de variantes para aplanar las cosas, y luego ejecutar sus inserciones condicionales en función de los resultados de esa vista.

3
Mike Walton 13 dic. 2019 a las 20:57

Creo que es mejor implementar un UDF de Javascript que tome la matriz y el tipo como parámetro. Algo como esto que es menos holgazán con los casos límite

CREATE OR REPLACE FUNCTION gp(a array, type variant)
  RETURNS variant
  LANGUAGE JAVASCRIPT
AS
$$
  return A.filter(item => item.type == TYPE).map(item => item.value)[0];
$$
;

with tbl as (select parse_json($1) json from values ('{service:[{type:1,value:100},{type:2,value:200}]}'))
select gp(json:service,1) type_1, gp(json:service,2) type_2 from tbl;

TYPE_1  TYPE_2
100 200
3
Nat Taylor 13 dic. 2019 a las 20:28