SQL Select 语句中的特殊转义字符(括号和反斜杠)与列名中带引号的括号之间发生冲突我在使用包含括号的列名的 SQL Select 语句时遇到了问题,因为列名的尾括号位于反斜杠旁边(由于在引号内使用引号:“ \!”列名 [单位] \!” “)并且这会干扰周围的特殊转义字符(括号和反斜杠:\[ ]\ )。
SQL 语句写在两个括号和斜杠之间(“ \[ Select ... ]\ ”),我在整个语句周围使用 Eval(Parse(Eval Insert())) 来评估变量(按开始日期过滤)。
该命令的结构如下:
Eval(解析(Eval 插入(
“dt = 打开数据库(设置,
\[选择 \!"表1\!".\!"列名[单位]\!" ... ]\
);”
)));
如您所见,column_name[units] 后面的结束括号位于列名两侧引号的反斜杠旁边,实际上构成了一个不需要的特殊转义字符 ( ]\ )。
- 我尝试过在列名周围使用单引号,命令执行后没有检索到任何数据。在搜索有关单引号的讨论或文档时,我找不到任何内容。
- 我尝试使用 eval 插入替换字符串来替换引号(“和 \!”),但没有成功。
- 我已查看了关于此问题的几次讨论,但尚未找到解决方案。
我将非常感激任何关于如何解决这种情况的建议,我应该尝试什么或我需要阅读什么?
自动化和脚本视窗回复:SQL Select 语句中特殊转义字符(括号和反斜杠)与列名中带引号的括号之间的冲突首先,我建议您不要使用 Eval(Parse())。我认为您应该能够在字符串中使用 ]"
Names Default To Here(1);
str = "\[abc]"]\";
write(str); // abc]"
如果不是那么那么如何使用正则表达式替换字符串中的方括号“[” “]”?可能会提供一些额外的想法。
回复:SQL Select 语句中特殊转义字符(括号和反斜杠)与列名中带引号的括号之间的冲突我尝试删除 Eval(Parse()) 并仅创建字符串以开始。 特殊转义字符似乎仍然会产生问题,或者是其他问题。 但是当我删除特殊转义字符 ( \[ ]\ ) 时问题就消失了,当我将列名称中的括号更改为圆括号时问题也消失了。
str = "\[\!"表\!".\!"列[单位]\!"n]\";
感谢您的回复!
回复:SQL Select 语句中特殊转义字符(括号和反斜杠)与列名中带引号的括号之间的冲突您使用的是哪个 JMP 版本?我的电脑上目前没有任何数据库,因此我无法使用 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);
回复:SQL Select 语句中特殊转义字符(括号和反斜杠)与列名中带引号的括号之间的冲突我正在研究 JMP 17。我明白了,改用“新 SQL 查询”可能可以解决这些问题,我认为这是个好建议。我在这里没有使用它,因为我正在构建一些较旧的脚本。
如果有办法处理字符串管理,我会全神贯注,但我想我会尝试改变命令。
谢谢你!
回复:SQL Select 语句中特殊转义字符(括号和反斜杠)与列名中带引号的括号之间的冲突如果你已经使用“\[]\”转义字符串,则无需再次执行此操作
Names Default To Here(1);
str = "\["table"."column[unit]"n]\";
Write(str); // "table"."column[unit]"n<BR />
回复:SQL Select 语句中特殊转义字符(括号和反斜杠)与列名中带引号的括号之间的冲突不确定我是否理解了您的评论,但我认为这是一个误会(无论如何感谢您的建议)。我只使用“\[]\”转义一次,第二次出现符号是因为列名带有括号,结尾处有一个反斜杠,我无法避免使用它。
回复:SQL Select 语句中特殊转义字符(括号和反斜杠)与列名中带引号的括号之间的冲突是的,这可能只是一些简单的混淆,因为我的评论是基于你使用 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
回复:SQL Select 语句中特殊转义字符(括号和反斜杠)与列名中带引号的括号之间的冲突很高兴看到更好的代码结构,谢谢!