create procedure my_stored_procedure(TABLE VARCHAR) returns varchar language javascript as $$ var sql_col_list = `select distinct key_name from TABLE;` results = snowflake.execute({sqlText: sql_col_list}); while (results.next()) { script += ',' + results.getColumnValue(1) + '\n'; }Salida de corriente:
, column1 , column2 , column3Salida deseada:
column1 , column2 , column2¿Cómo puedo hacer esto en javascript dentro del procedimiento almacenado sql? Me gustaría no tener que ejecutar la consulta más de una vez porque la consulta real es computacionalmente intensiva.
usando su sp, eliminaría el primer resultado del bucle para que sea:
create or replace procedure my_stored_procedure(TABLE VARCHAR) returns varchar language javascript as $$ var sql_col_list = `select distinct key_name from TABLE;` results = snowflake.execute({sqlText: sql_col_list}); var script = ''; results.next() script += results.getColumnValue(1) while (results.next()) { script += ',' + results.getColumnValue(1) + '\n'; } return script; $$;Una mala solución después de la solución de hecho, elimínela:
> ',a,b,c'.replace(/^,/,''); 'a,b,c' >otra opción es construir una matriz de las partes deseadas y luego usar unir
> ['a','b','c'].join(',\n'); 'a,\nb,\nc' >y si quieres la nueva línea final:
> ['a','b','c'].join(',\n')+'\n'; 'a,\nb,\nc\n' >O puede hacer que Snowflake lo haga por usted:
SELECT listagg( DISTINCT key_name, ',\\n') || '\\n' FROM VALUES ('apple'),('cat'),('apple'),('cat'),('dog') t(key_name);| LISTAGG( DISTINCT KEY_NAME, ',\N')|| '\NORTE' |
|---|
| manzana,\ngato,\ndoperro\n |
puede agregar un control booleano si esto es lo primero o no:
var sql_col_list = `select distinct key_name from TABLE;` results = snowflake.execute({sqlText: sql_col_list}); var isFirst = true; while (results.next()) { if(isFirst) { script += results.getColumnValue(1) + '\n'; isFirst = false; continue; } script += ',' + results.getColumnValue(1) + '\n'; }