2016-02-24 59 views
-1

嘿所有我在下面,下面的代碼我一直在努力:拆分查詢(SELECT/FROM/WHERE/AND/OR)

var sql = "SELECT pillers, Balloons, Tacks FROM the_database_file WHERE Balloons != 'small' AND Balloons != 'large' AND Blah = 'bobby';"; 

$(document).ready(function() { 
    var findFROM  = sql.indexOf(" FROM"); 
    var findWHERE  = sql.indexOf(" WHERE"); 
    var findAND   = sql.indexOf(" AND"); 
    var findOR   = sql.indexOf(" OR"); 
    var findSemicolon = sql.indexOf(";"); 
    var findCountAND = sql.match(/\AND\b/g); 
    var findCountOR  = sql.match(/\OR\b/g); 

    var txtSELECT  = sql.substring(0, findFROM); 
    var txtFROM   = sql.substring(findFROM, findWHERE); 
    var txtWHERE  = ""; 
    var txtAND   = ""; 
    var txtOR   = ""; 

    if (findAND != -1) { 
     var _tmpPos  = 0; 
     var _tmpAND  = ""; 

     findCountAND = (findCountAND? findCountAND.length : 0); 
     findCountOR  = (findCountOR? findCountOR.length : 0); 

     for (var i = 1; i < findCountAND; i++) { 
      console.log(i); 
      _tmpPos = nth_occurrence(sql, ' AND', i); 
      _tmpPos = findAND; 
      findAND = sql.indexOf(" AND"); 
      _tmpAND = sql.substring(_tmpPos, findAND); 
     } 

     txtWHERE = sql.substring(findWHERE, findAND); 
    } 

    $('#SELECT').text(txtSELECT); 
    $('#FROM').text(txtFROM); 
    $('#WHERE').text(txtWHERE); 
    $('#test').text(findAND); 
}); 

function nth_occurrence(string, char, nth) { 
    var first_index = string.indexOf(char); 
    var length_up_to_first_index = first_index + 1; 

    if (nth == 1) { 
     return first_index; 
    } else { 
     var string_after_first_occurrence = string.slice(length_up_to_first_index); 
     var next_occurrence = nth_occurrence(string_after_first_occurrence, char, nth - 1); 

     if (next_occurrence === -1) { 
      return -1; 
     } else { 
      return length_up_to_first_index + next_occurrence; 
     } 
    } 
} 

我試圖像這樣格式化:

SELECT pillers, Balloons, Tacks 
FROM the_database_file 
WHERE Balloons != 'small' 
AND Balloons != 'large' 
AND Blah = 'bobby'; 

不過,我陷在試圖找到查詢字符串多於一個OR的區域。上面的例子只有2 的開始,但我似乎無法得到正確的代碼。

nth_occurrence功能被發現HERE

如果有人能幫助我,那會很棒。可能REGEX將會是所有需要的?誰知道?

A JSFIDDLE也已設置好。

UPDATE

得益於一種論壇成員HERE我能更新我的JSFIDDLE我試圖在試圖重建他做了什麼:

[ { word: 'SELECT', index: 0, text: 'pillers, Balloons, Tacks' }, 
    { word: 'FROM', index: 32, text: 'the_database_file' }, 
    { word: 'WHERE', index: 55, text: 'Balloons != \'small\'' }, 
    { word: 'AND', index: 81, text: 'Balloons != \'large\'' }, 
    { word: 'AND', index: 105, text: 'Blah = \'bobby\'' }, 
    { word: ';', index: 123 } ] 

但是,我嘗試沒來同樣的。任何幫助?

回答

0

找到了解決辦法:

Update JSFIDDLE

function parseSql(sql) { 
    var found = []; 

    ["SELECT", "WHERE", "FROM", "AND", "OR", ";"].forEach(function(word) { 
    var idx = sql.indexOf(word); 

    while(idx!==-1) {  
     found.push({word:word, index:idx}); 
     idx = sql.indexOf(word, idx + 1); 
     keptIdx = idx; 
    } 
    }); 

    found.sort(function(x,y) { return x.index - y.index }); 
    found.forEach(function(x, i, xs) { 
    if (i < xs.length - 1) { 
     x.text = sql.substring(x.index, xs[i + 1].index).replace(xs[i].word, "").trim(); 
    } 
    }); 

    return found; 
} 
+0

如果什麼關鍵詞將是小寫 - 沒有檢測?或者,例如,將會有類似於「來自t1 ...的從...開始的SELECT t1.countryFrom ...」的查詢。您的parcer在第一個「from」提到時會失敗。這不是一個好方法,正如我在下面的答案中所述。 – Farside

0

你的實現是非常棘手的,我可以想象很多情況下,當它將無法解析。

我建議不要重新發明輪子,並利用現有的庫來解析SQL與JS:

  1. SQL parser
  2. simpleSqlParser
  3. node-sqljs
  4. ....

等。有許多複雜的現成解決方案。