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
2 respuestas
¿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.
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
Preguntas relacionadas
Nuevas preguntas
snowflake-cloud-data-platform
Snowflake Cloud Data Platform tiene una arquitectura compartida de varios clústeres que proporciona una ubicación única para datos estructurados y semiestructurados que se pueden consultar con ANSI SQL. Snowflake es una plataforma independiente de la nube con una escala muy grande que admite muchas cargas de trabajo diferentes: almacenamiento y análisis de datos, lago de datos, ingeniería de datos, intercambio seguro de datos, aplicaciones de datos y ciencia de datos.