识别javascript字符串中的子查询

时间:2017-08-03 12:59:55

标签: javascript mysql database

我有一个脚本,它将查询作为字符串,然后附加查询以将数据库名称添加到任何列出的表中。我的目的是使用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>";
  }
}

1 个答案:

答案 0 :(得分:0)

这可能是一个坏主意,所以要小心。

在下面的代码中,我使用String#replace和正则表达式 正则表达式查找FROM后跟一个或多个空格字符,后跟单个字符,而不是(),并将该字符保存在捕获组中。然后它用FROM db_name.$1替换整个匹配,其中$1是捕获组中捕获的文本。

可以修改它以处理其他类型的查询,或者您可以使用多个正则表达式模式。

&#13;
&#13;
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;
&#13;
&#13;