在nodejs SQLite3 .each()方法中,如何添加多个参数来处理多个"WHERE ... = ?"查询?



我有一个表,其中包含一个名为 CRS_TITLE 的列,我想在该列中搜索课程标题列表。现在我的代码一次只能处理一个参数。我想我可以写一个简单的循环,在每次迭代期间,我都可以用一个新的类名再次调用 db.each((。我知道这种方式效率低下,所以我想一次检查所有参数。

我尝试过的事情:

1(在WHERE和其他变体中添加另一个"?"。

2(使用来自javascript的新扩展运算符,例如[...类]在传入参数时。

由于语法错误,上述方法均无效。

无论如何,这是我下面的代码。

let sqlite3 = require('sqlite3').verbose()
// open the database
let db = new sqlite3.Database('./classes.db', (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected to the classes database.');
});
let sql = `SELECT CRS_CDE course_code,
Column3 start_time,
Column4 end_time
FROM spring_schedule
WHERE CRS_TITLE = ?`; 
// I want to do multiple "WHERE = ?" here.
// with multiple arguments 
let className1 = 'Spanish I'
// I want to change the line above to this instead.
// let classNames = ['Accounting I', 'English', 'Math'...etc]

db.each(sql, [className1]/*pass an array of items to look up instead of just 1 item.*/, (err, row) => {
if (err) {
throw err;
}
console.log(`${row.course_code} ${row.start_time} - ${row.end_time}`);
// Will use this result to update frontend.
});
// close the database connection
db.close();

编辑:下面的工作代码。

let sql = `SELECT CRS_CDE course_code,
Column3 start_time,
Column4 end_time
FROM spring_schedule
WHERE CRS_TITLE IN `;
let classNames = ['Spanish I', 'Accounting II', 'College Algebra']
let where = '(?' + ',?'.repeat(classNames.length-1) + ')';
sql += where;
db.each(sql, [...classNames], (err, row) => {
if (err) {
throw err;
}
console.log(`${row.course_code} ${row.start_time} - ${row.end_time}`);
// Will use this result to update frontend.
});
db.close();

您可以尝试使用精确数量的参数来构建动态WHERE IN子句以匹配您的输入数组:

let sql = `SELECT CRS_CDE course_code, Column3 start_time, Column4 end_time
FROM spring_schedule
WHERE CRS_TITLE IN `;
let classNames = ['Accounting I', 'English', 'Math'];
let where = '(?' + ',?'.repeat(classNames.length-1) + ')';
sql += where;
db.all(sql, [], (err, rows) => {
if (err) {
throw err;
}
rows.forEach((row) => {
console.log(row.name);
});
});
db.close();

最新更新