首页 > 解决方案 > NodeJS、sqlite3 和 WHERE IN 参数

问题描述

NodeJS 的sqlite3是否支持WHERE IN查询参数?

我有以下小程序。

const sqlite3 = require('sqlite3');
const db = new sqlite3.Database('./data/data.db');

const sql = `
    SELECT * FROM accounts
    WHERE
        name IN ('Business Expense - Internet Service','RCSB Checking')`;

db.all( sql,
        function getAccout(error, rows) {
            console.log(error);
            console.log(rows);
        });

该程序“有效”。它查询数据库,并且rows变量成功地填充了来自两个单独行的数据。

但是,我不想要硬编码值。我想参数化我的值。以下代码适用于此。

const sql = `
    SELECT * FROM accounts
    WHERE
        name = ? OR name = ?`;

db.all( sql,
        ['Business Expense - Internet Service','RCSB Checking'],
        function getAccout(error, rows) {
            console.log(error);
            console.log(rows);
        });

但是,我希望它适用于任意数量的名称。即我想参数化原始WHERE IN查询。但是,下面的程序

const sql = `
    SELECT * FROM accounts
    WHERE
        name IN (?)`;

db.all( sql,
        [['Business Expense - Internet Service','RCSB Checking']],
        function getAccout(error, rows) {
            console.log(error);
            console.log(rows);
        });

不起作用。它运行没有错误,但返回零行。我还尝试使用连接字符串作为参数

const sql = `
    SELECT * FROM accounts
    WHERE
        name IN (?)`;

db.all( sql,
        ["'Business Expense - Internet Service','RCSB Checking'"],
        function getAccout(error, rows) {
            console.log(error);
            console.log(rows);
        });

这也没有用。

库是否sqlite3支持参数化WHERE IN查询?如果是这样,这样做的语法是什么?如果没有,NodeJS 社区中是否有常见的解决方法?

标签: javascriptnode.jssqlite

解决方案


不知道有没有支持,万一没有

const params = [...]
const sql = `
    SELECT * FROM accounts
    WHERE
        name IN (${new Array(params.length).fill('?').join(',')})`;

推荐阅读