我使用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,如果我将其中一个字段留空,则不返回任何内容。
我在构建查询时错过了一个技巧吗?
谢谢!
答案 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语句......