我有一个脚本,它将查询作为字符串,然后附加查询以将数据库名称添加到任何列出的表中。我的目的是使用Sequel Pro运行一个大型查询,它将搜索服务器上的所有数据库,而不需要在每个单独的数据库上运行查询或使用sqldumps。到目前为止,它工作得很好......除了处理子查询时。
使用如下的查询:
SELECT apple FROM basket
脚本会正确附加它,以便它以
形式出现SELECT apple FROM db_name.basket
但是,如果我尝试类似
的话SELECT apple FROM (SELECT fruit FROM basket) tmpTableA
它将名称附加到起始括号
SELECT apple FROM db_name.(SELECT fruit FROM db_name.basket) tmpTableA
但我需要它更像这样:
SELECT apple FROM (SELECT fruit FROM db_name.basket) tmpTableA
到目前为止,我还没有弄清楚如何识别和跳过紧跟FROM语句的子查询,同时仍然附加在FROM语句后面的常规表之前。这是我脚本中的代码段:( dbList是一个包含服务器上每个数据库名称的数组)
for (count = 0; count < dbList.length; count++){
var dbName = "`" + dbList[count] + "`";
var rawSQL = userQuery + "<br>"; //userQuery pulls from the input and converts to lowercase
rawSQL = rawSQL.replace(/ from /ig, " from " + dbName + ".");
rawSQL = rawSQL.replace(/ join /ig, " join " + dbName + ".");
strSQL += rawSQL; //strSQL is later displayed on the page for the user
if (count < dbList.length - 1){
strSQL += "UNION<br>";
}
}
答案 0 :(得分:0)
这可能是一个坏主意,所以要小心。
在下面的代码中,我使用String#replace
和正则表达式
正则表达式查找FROM
后跟一个或多个空格字符,后跟单个字符,而不是(
或)
,并将该字符保存在捕获组中。然后它用FROM db_name.$1
替换整个匹配,其中$1
是捕获组中捕获的文本。
可以修改它以处理其他类型的查询,或者您可以使用多个正则表达式模式。
let q = "SELECT apple FROM (SELECT fruit FROM basket) tmpTableA"
let newQ = q.replace(/FROM\s+([^\(\)])/gi, "FROM db_name.$1");
console.log(newQ);
&#13;