nodejs中的变量sqlite3查询

时间:2014-12-15 19:03:43

标签: node.js sqlite

我使用node.js构建一个简单的表单,询问您期望的内容: - 名字 - 姓 - 地址

使用名为firstName,lastName,address的字段对sqlite3数据库进行查询。我想混合和匹配查询,但是 - 您可以搜索lastName OR firstName以及lastName或lastName以及街道地址的一部分等。

为每个案例编写单独的查询会很烦人,但我不确定如何做到这一点。在代码中,如果我输入名字或姓氏,则以下内容有效:

db.serialize(function() {
   db.each("SELECT rowid AS id, lastName, firstName FROM county WHERE firstName = ? OR lastName = ?", firstName, lastName, function(err, row) {
   console.log(row.id + ": " + row.firstName + ' ' + row.lastName);  
   }
}

但是,如果我输入名字和姓氏,我希望它是AND而不是仅返回两者匹配的行。如果我在该子句中执行AND,如果我将其中一个字段留空,则不返回任何内容。

我在构建查询时错过了一个技巧吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

我认为最好在代码中实现它。像这样:

var sqlite3 = require('sqlite3').verbose(),
    db = new sqlite3.Database('peeps.db');

var runQuery = function(request) {
    var select = 'select rowid AS id, firstName, lastName from country where ',
        query,
        params = []; 

    if (request.first && request.last) {
        query = select + "firstName=? and lastName=?"
        params.push( request.first, request.last );
    } else if (request.first) {
        query = select + "firstName=?"
        params.push( request.first );
    } else if (request.last) {
        query = select + "lastName=?"
        params.push( request.last );
    }   

    if (request.address) {
        params.push( request.address );

        if (!query) {
            query = select + " address like ?"; 
        } else {
            query = query + " and address like ?"; 
        }   
    }   

    db.each( query, params, function(err, row) {
        console.log( 'id:', row.id, row.firstName, row.lastName );
    }); 
};

var createTestData = function() {

    var stmt = db.prepare('insert into country values (?, ?, ?)');

    stmt.run('john', 'smith', '123 state street');
    stmt.run('jane', 'doe', '400 doe street');
    stmt.run('jeff', 'lebowski', 'dude ave, dudeville');

    stmt.finalize();
};

db.serialize(function() {
    db.run('create table if not exists country( firstName text, lastName text, address text )');
    // createTestData();

    var searches = [ 
        { first:'john', last:'smith' },
        { first:'jane' },
        { last:'lebowski' },
        { address:'%street%' }
    ];  

    searches.forEach(function(request) {
        runQuery( request );
    }); 
});

db.close();

这不是我想要的面向对象,但它演示了如何为各种查询参数构造SQL语句......