SQL personalizado y Eval / Parse (y \! \! \! ...)¡Hola!
Hago muchas consultas que no pueden usar el generador de consultas JMP y deben estar escritas en SQL personalizado.
Pero como también quiero generalizar mi código, tengo que integrar una gran cantidad de eval / inserts y \!
Aquí hay un ejemplo:
Código aún no generalizado
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT \!"t1\!".lot_id
FROM \!"public\!".\!"v_test_run\!" \!"t1\!"
WHERE ( ( ( \!"t1\!".test_run_timestamp >= '2020-11-01 15:25:11' ) ) ) ;"
)
) << Modify;
Código generalizado para incluir una fecha:
gbStr = Eval Insert("
New SQL Query(
Connection(
\!"ODBC:blabla\!"
),
QueryName( \!"v_test_run\!" ),
CustomSQL(
\!"SELECT \!\!\!"t1\!\!\!".lot_id
FROM \!\!\!"public\!\!\!".\!\!\!"v_test_run\!\!\!" \!\!\!"t1\!\!\!"
WHERE ( ( ( \!\!\!"t1\!\!\!".test_run_timestamp >= '^date_deb^' ) ) ) ;\!"
)
) << Modify;
");
Eval( Parse( gbStr ) );¿Existe algún otro método que me salve de tener que hacer malabares con estos \! \! \! símbolos?
¡En scripts complejos es realmente difícil de manejar y depurar!
Gracias
ScriptingRe: SQL personalizado y Eval / Parse (y \! \! \! ...)Hay algunas opciones descritas en Este artículo , Recomiendo comenzar con Eval (Eval Expr ()) y luego envolver cada pieza que necesita reemplazar con Expr ().Podría verse algo como esto:
Eval( Eval Expr(
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"\[SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ']\" || datevariable || "\[' ) ) ) ;]\"
)
) << Modify
) );
Re: SQL personalizado y Eval / Parse (y \! \! \! ...)¡Muchas gracias! Había leído este artículo y lo había intentado, pero todavía tengo dificultades para dominar esta eval (eval expr (expr))
Re: SQL personalizado y Eval / Parse (y \! \! \! ...)Usaría los delimitadores \ [y] \ para incluir comillas dobles en la cadena.
date_deb = "to_date('01-Mar-2019', 'dd-mon-yyyy')";
gbStr = Eval Insert("\[
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= ^date_deb^ ) ) ) ;"
)
) << Modify;
]\");
write(gbstr);
Eval( Parse( gbStr ) );
Salida:
New SQL Query(
Connection(
"ODBC:blabla"
),
QueryName( "v_test_run" ),
CustomSQL(
"SELECT "t1".lot_id
FROM "public"."v_test_run" "t1"
WHERE ( ( ( "t1".test_run_timestamp >= to_date('01-Mar-2019', 'dd-mon-yyyy') ) ) ) ;"
)
) << Modify;Re: SQL personalizado y Eval / Parse (y \! \! \! ...)Estoy de acuerdo en que esta sintaxis solo es obvia una vez que la entiendes, e incluso entonces es confusa.Revisa este artículo de la lista de deseos para introducir una función Eval Expr First (), ¿tal vez sería más intuitivo?
Re: SQL personalizado y Eval / Parse (y \! \! \! ...)Me gusta seguir un camino diferente evitando combinaciones de análisis de evaluación poco intuitivas, donde las encuentro bastante útiles para otros propósitos.
A menudo tengo consultas complejas (construidas en SQL simple por otras herramientas como el desarrollador de SQL). Y necesito modificar algunas variables.
El ejemplo adjunto muestra cómo funciona con la tabla de datos de clase grande, sin embargo, funcionaría para todas las conexiones ODBC de manera similar.
Simplemente preparo mi cadena de conexión (no se usa aquí) y la consulta SQL en una variable de cadena, dada al objeto "Nueva consulta SQL".
Yo uso "asignar" (en lugar de "=") porque funciona bien para consultas grandes y plegado de código.
Y soy más flexible para usar también la función de base de datos abierta o procesar el SQL de otras maneras.
Por lo general, las comillas dobles no son necesarias en un SQL simple (y trato de evitarlo también), a menos que tenga nombres con espacios, etc. como "Big Class".
Names Default To Here( 1 );
cdt = Open( "$Sample_Data\Big Class.jmp" );
age = "15";
// define custom SQL with placeholder
Assign( sql_str, "SELECT t1.name, t1.age, t1.sex, t1.height,
t1.weight
FROM \!"Big Class\!" t1
WHERE ( ( ( t1.age IN ( &age ) ) ) ) ;" );
// fill placeholder
Substitute Into( sql_str, "&age", "15" );
// execute query
dt_age = New SQL Query( Version( 130 ), Connection( "JMP" ), JMP Tables( cdt ), QueryName( "aged" || "_" || age ), CustomSQL( sql_str ) ) << Run;
Re: SQL personalizado y Eval / Parse (y \! \! \! ...)¡Genial, eso es realmente muy útil! Y como acabamos de crear la base de datos y yo era el actor principal de esta creación, me aseguré de que ningún nombre de tabla o variable tenga paréntesis o espacios, por lo que debería simplificar esta generalización.