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

时间:2012-06-11 00:56:22

标签: javascript jquery 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完成,但我不想继续往返于服务器,我也希望允许离线使用。

7 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:5)

只要数据可以作为对象数组在内存中,您就可以使用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

答案 2 :(得分:4)

试试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]);

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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

查看此tut

它非常强大而且快速。具有活动装订等功能,让您的生活变得轻松。

答案 6 :(得分:0)

Coils是一个Clojurescript框架,它编译为Javascropt并且具有这样的客户端SQL查询:

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

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

https://github.com/zubairq/coils