SQLカスタムおよび評価/解析(および\!\!\!...)こんにちは!
JMPクエリビルダーを使用できず、SQLカスタムで作成する必要があるクエリをたくさん実行します。
しかし、コードも一般化したいので、多くのeval / insertsと\!を統合する必要があります。
次に例を示します。
コードはまだ一般化されていません
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;
日付を含むように一般化されたコード:
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 ) );これらとジャグリングする必要がないようにする他の方法はありますか? \!\!\!シンボル?
複雑なスクリプトでは、処理とデバッグが非常に困難です。
ありがとうございました
スクリプティングRe:SQLカスタムおよび評価/解析(および\!\!\!...)に概説されているいくつかのオプションがありますこの記事、Eval(Eval Expr())から始めて、置き換える必要のある各部分をExpr()でラップすることをお勧めします。次のようになります。
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カスタムおよび評価/解析(および\!\!\!...)どうもありがとうございました! 私はこの記事を読んで試しましたが、この評価をマスターするのにまだ問題があります(eval expr(expr))
Re:SQLカスタムおよび評価/解析(および\!\!\!...)文字列に二重引用符を含めるには、区切り文字\ [および] \を使用します。
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 ) );
出力:
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カスタムおよび評価/解析(および\!\!\!...)この構文は、理解して初めて明らかであり、それでも混乱を招くことに同意します。チェックアウトこのウィッシュリストアイテムEval Expr First()関数を導入するには、おそらくそれはより直感的でしょうか?
Re:SQLカスタムおよび評価/解析(および\!\!\!...)私は、直感的でないeval解析の組み合わせを避けて、別のパスをたどるのが好きです。そこでは、他の目的に非常に役立つことがわかります。
多くの場合、複雑なクエリがあります(SQL開発者などの他のツールによってプレーンSQLに組み込まれています)。 そして、私はいくつかの変数を変更する必要があります。
添付の例は、大きなクラスのデータテーブルでどのように機能するかを示していますが、すべてのODBC接続で同様に機能します。
「新しいSQLクエリ」.objectに指定された文字列変数に接続文字列(ここでは使用されていません)とSQLクエリを準備するだけです。
大規模なクエリやコード折り畳みに適しているため、(「=」の代わりに)「assign」を使用します。
また、オープンデータベース関数を使用したり、他の方法でSQLを処理したりすることもできます。
「BigClass」のようにスペースなどを含む名前がない限り、通常、プレーンSQLでは二重引用符は必要ありません(私も避けようとします)。
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カスタムおよび評価/解析(および\!\!\!...)素晴らしい、それは本当にとても便利です! また、データベースを作成したばかりで、私がこの作成の主役だったので、テーブル名や変数名に括弧やスペースがないことを確認したので、この一般化を単純化する必要があります。