【问题标题】:In nodejs SQLite3 .each() method, how can I add mulitple arguments to work with multiple "WHERE ... = ?" queries?在节点 js SQLite3 .each() 方法中,如何添加多个参数以使用多个“WHERE ... =?”查询?
【发布时间】:2020-04-23 02:03:45
【问题描述】:

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

我尝试过的事情:

1) 添加另一个“?”在 WHERE 和其他变体中。

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

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

不管怎样,下面是我的代码。

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 CRS_TITLE = ? OR CRS_TITLE = ? ...,但您说它仍然不起作用?什么是语法错误?

标签: javascript sql node.js sqlite


【解决方案1】:

您可以尝试使用与输入数组匹配的确切参数数量来构建动态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();

【讨论】:

  • 大概你的意思是IN而不是=
  • 谢谢。我没有使用 db.all,但在您的帮助下我的代码确实可以正常工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多