如何在客户端浏览器中执行类似SQL的查询?

我一直在寻找一种方法来执行复杂的查询,比如SQL可以执行,但完全是客户端。 我知道我可以通过服务器上的SQL查询得到我想要的确切结果,我甚至可以使用它来使它看起来很流畅。 但是,出于可扩展性,性能和带宽的原因,我宁愿在所有客户端执行此操作。

一些要求:

  • 广泛的浏览器兼容 任何可以运行jQuery的东西都很好。 我其实更喜欢它是一个jQuery插件。
  • 可以对多个列进行排序。 例如,按字母顺序排序,并在每个州内按字母顺序列出所有城市。
  • 可以过滤结果。 例如,相当于“where state =’CA’或’NY’或’TX’”。
  • 必须完全在客户端工作,因此用户只需要下载一大组数据,并且可以根据需要剪切数据而无需不断地从服务器获取数据,并且实际上能够在初始拉取后离线执行所有查询。

我查看了stackoverflow并找到了jslinq,但它最后一次更新是在2009年,没有文档。 我也无法判断它是否可以执行更复杂的查询,例如在两个不同的列上进行排序或执行“和”或“或”过滤。

我认为这样的事情已经完成了。 我知道HTML5从这条路开始,但后来遇到了障碍。 我只需要基本的查询,没有连接或任何东西。 有谁知道可以做到这一点的事情? 谢谢。

编辑:我想我应该包括一个用例来帮助澄清我正在寻找的东西。

例如,我列出了美国5000个最大的城市。 每条记录包括城市名称,州和人口。 我希望能够下载整个数据集一次并使用它填充JS数组,然后,仅在客户端,能够运行如下的查询,并从结果记录中创建一个表。

  • 加州十大城市
  • 所有以“S”开头且人口为1,000,000或以上的城市。
  • 加利福尼亚州,纽约州,佛罗里达州,德克萨斯州和伊利诺伊州最大的三个城市,按州和按人口按字母顺序排列。 即加州,洛杉矶,3,792,621; 加州,圣地亚哥,1,307,402; 加州,圣何塞,945,942等。

所有这些查询都可以通过SQL完成,但我不想继续往返于服务器,我也想允许离线使用。

看看http://linqjs.codeplex.com/

它可以轻松满足您的所有要求。

只要数据可以作为对象数组在内存中,您就可以使用sortfilter 。 例如,假设您要过滤产品。 您希望找到低于5美元或高于100美元的所有产品,并且您希望按价格(升序)排序,如果有两种产品具有相同价格,则按制造商排序(降序)。 你可以这样做:

 var results = products.filter(function(product) { // price is in cents return product.price < 500 || product.price > 10000; }); results.sort(function(a, b) { var order = a.price - b.price; if(order == 0) { order = b.manufacturer.localeCompare(a.manufacturer); } return order; }); 

对于跨浏览器兼容性,只需填充filter

试试Alasql.js 。 这是一个javascript客户端SQL数据库。

您可以使用连接和分组进行复杂查询,甚至可以优化连接和部件。 它不使用WebSQL。

您的要求支持:

  • 广泛的浏览器兼容性 – 所有现代版本的浏览器,包括手机。
  • 可以对多个列进行排序.- Alasql使用ORDER BY子句进行排序。
  • 可以过滤结果。 – 使用WHERE子句。
  • 必须完全在客户端工作,因此用户只需要下载一大组数据,并且可以根据需要剪切数据而无需不断地从服务器获取数据,并且实际上能够在初始拉取后离线执行所有查询。 – 您可以使用纯JavaScript(Array.push()等)操作来修改数据(不要忘记设置table.dirty标志)。

这是一个简单的例子(在jsFiddle中使用它):

 // Fill table with data var person = [ { name: 'bill' , sex:'M', income:50000 }, { name: 'sara' , sex:'F', income:100000 }, { name: 'larry' , sex:'M', income:90000 }, { name: 'olga' , sex:'F', income:85000 }, ]; // Do the query var res = alasql("SELECT * FROM ? person WHERE sex='F' AND income > 60000", [person]); 

雅虎的YQL怎么样? 我只是简单地看了一下,但它看起来很有趣。

Backbone是一个非常好的js库(他们的话)“通过提供具有键值绑定和自定义事件的模型,具有可枚举函数的丰富API的集合,具有声明性事件处理的视图,并将它们全部连接到”来为Web应用程序提供结构“您在RESTful JSON界面上的现有API。“

我不确定这是否是您正在寻找的,但您可以使用它来模拟您的模型并将事件侦听器绑定到它。 这似乎是一个很好的教程,可以通过它的一些基本用途。

你可以使用CanJS 。 它是一个相对较新的库,其性能优于Backbone和其他基于臭名昭着的JavaScript MVC库。 实际上,它是JS MVC的MVC部分,含有一些香料。

您可以通过net.tutsplus.com查看此tut。http://net.tutsplus.com/tutorials/javascript-ajax/diving-into-canjs-part-3/

它非常强大而且快速。 具有实时装订等function,让您的生活更轻松。

Coils是一个Clojurescript框架,它编译为Javascropt并具有如下客户端SQL查询:

 (go (log (sql "SELECT * FROM test_table where name = ?" ["shopping"] ))) 

:它是传递给服务器端关系数据库的完整SQL:

https://github.com/zubairq/coils