SQL 選択ステートメントで、特殊なエスケープ文字 (括弧とバックスラッシュ) と、引用符で囲まれた列名の括弧が衝突しています。括弧を含む列名を使用する SQL 選択ステートメントで問題が発生しています。列名の末尾の括弧がバックスラッシュの横に配置され (引用符内で引用符を使用しているため: " \!" 列名 [ 単位 ] \!" " )、これが周囲の特殊なエスケープ文字 (括弧とバックスラッシュ: \[ ]\ ) と干渉するためです。
SQL ステートメントは 2 つの括弧とスラッシュ ( \[ Select ... ]\ ) の間に記述され、ステートメント全体で Eval(Parse(Eval Insert())) を使用して変数を評価します (開始日によるフィルタリング)。
コマンドは次のように構成されます。
評価(解析(評価挿入(
"dt = データベースを開く(設定、
\[\!"table1\!".\!"column_name[units]\!" を選択します...]\
);"
)));
ご覧のとおり、column_name[units] の後の終了括弧は、列名を囲む引用符のバックスラッシュの隣に配置され、実質的に不要な特殊エスケープ文字 (]\) を構成します。
- 列名を一重引用符で囲んでみましたが、コマンドは実行されましたが、データは取得されませんでした。一重引用符に関するディスカッションやドキュメントを検索しましたが、何も見つかりませんでした。
- 引用符 ( " と \!" の両方) に eval insert 置換文字列を使用しようとしましたが、成功しませんでした。
- これについてはいくつかの議論を調べましたが、まだ解決策を見つけることができませんでした。
この状況を解決する方法、試すべきこと、調べておくべきことなどについて、何かアドバイスがあればいただければ幸いです。
自動化とスクリプトウィンドウズRe: SQL 選択ステートメントで、特殊なエスケープ文字 (括弧とバックスラッシュ) と、引用符で囲まれた列名の括弧が衝突するまず、Eval(Parse())を利用しないことをお勧めします。文字列内では]"を使用できるはずです。
Names Default To Here(1);
str = "\[abc]"]\";
write(str); // abc]"
そうでなければ文字列内の角括弧「[」「]」を正規表現で置き換えるにはどうすればよいでしょうか?追加のアイデアが得られるかもしれません。
Re: SQL 選択ステートメントで、特殊なエスケープ文字 (括弧とバックスラッシュ) と、引用符で囲まれた列名の括弧が衝突するEval(Parse()) を削除して、最初に文字列を作成してみました。特殊なエスケープ文字がまだ問題を引き起こしているようですが、他の原因があるようです。ただし、特殊なエスケープ文字 ( \[ ]\ ) を削除すると問題はなくなり、列名の角かっこを丸かっこに変更すると問題もなくなります。
str = "\[\!"テーブル\!".\!"列[単位]\!"n]\";
ご返信ありがとうございます!
Re: SQL 選択ステートメントで、特殊なエスケープ文字 (括弧とバックスラッシュ) と、引用符で囲まれた列名の括弧が衝突するどのバージョンの JMP を使用していますか? 現在、PC にデータベースがないため、Open Database を使用してテストすることはできませんが、JMP テーブルと New SQL Query() を使用して簡単なテストを行うことはできます。
Names Default To Here(1);
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
Column(dt1, 1) << Set Name("test[na me]");
dt = New SQL Query(
Connection("JMP"),
JMP Tables(["Big Class" => "$SAMPLE_DATA/Big Class.jmp"]),
Custom SQL("\[Select "test[na me]" from "Big Class"]\")
) << Run Foreground;
Close(dt1, No save);
Re: SQL 選択ステートメントで、特殊なエスケープ文字 (括弧とバックスラッシュ) と、引用符で囲まれた列名の括弧が衝突する私は JMP 17 を使用しています。なるほど、新しい SQL クエリに変更するとこれらの問題が解決するようです。これは良い提案だと思います。古いスクリプトに基づいて構築しているため、ここでは使用していません。
文字列管理を処理する方法があればぜひ教えてください。ただし、コマンドを変更してみようと思います。
ありがとう!
Re: SQL 選択ステートメントで、特殊なエスケープ文字 (括弧とバックスラッシュ) と、引用符で囲まれた列名の括弧が衝突するすでに「\[]\」を使用して文字列をエスケープしている場合は、再度行う必要はありません。
Names Default To Here(1);
str = "\["table"."column[unit]"n]\";
Write(str); // "table"."column[unit]"n<BR />
Re: SQL 選択ステートメントで、特殊なエスケープ文字 (括弧とバックスラッシュ) と、引用符で囲まれた列名の括弧が衝突するあなたのコメントを理解したかどうかわかりませんが、それは誤解だと思います (とにかく、提案してくれてありがとう)。 "\[]\" を使用してエスケープするのは 1 回だけです。記号が 2 回目に表示されるのは、括弧付きの列名がバックスラッシュの横に続いており、これを使用せざるを得ないためです。
Re: SQL 選択ステートメントで、特殊なエスケープ文字 (括弧とバックスラッシュ) と、引用符で囲まれた列名の括弧が衝突するええ、それは単なる混乱かもしれません。私のコメントは、Eval(Parse()) を使用した元のスクリプトに基づいているため、最終的には次のようになります。
Eval(Parse(Eval Insert(
"dt = Open Database( settings,
\[Select \!"table1\!".\!"column_name[units]\!" ... ]\
);"
)));
</CODE>when it maybe should look like</P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
mydate = "1.1.2000";
dt = Open Database(settings,
Eval Insert("\[Select "table1"."column_name[units]"... ^mydate^]\")
);
</CODE>with some more separation</P>
<PRE><CODE class=" language-jsl">Names Default To Here(1);
mydate = "1.1.2000";
sql_template = "\[Select "table1"."column_name[units]"... ¤mydate¤]\";
sql_str = Eval Insert(sql_template, "¤");
dt = Open Database(settings,
sql_str
);
https://www.jmp.com/support/help/en/18.0/index.shtml#page/jmp/jsl-syntax-rules.shtml
Re: SQL 選択ステートメントで、特殊なエスケープ文字 (括弧とバックスラッシュ) と、引用符で囲まれた列名の括弧が衝突するコードの構造が改善されてとても嬉しいです。ありがとうございます!