通过为node.js-mysql查询准备的语句实现多个通配符



我有一个JSON,如下所示:

{"name":[{"tag":"Peter"}]}

我正在用多个通配符动态构建一个准备好的语句,如下所示:

var sqlVar;
sqlVar += existParams.map(field => {
if (field === 'name') {
function getValues(item, index) {
var getVal = [item.tag];
return `${field} LIKE ?`;
}
return '('+name.map(getValues).join(' OR ')+')';
} else {
return `(${field} = ?)`
}
}).join(" AND ");
var sql = "SELECT * FROM names "+sqlVar+"";
connection.query(sql,
... 
function getValues(item, index) {
var getVal = [item.tag];
return '%' + getVal + '%';
}
return name.map(getValues);
//Further attempts
//var getResult = name.map(getValues);
//return getResult.split(",");
//return name.map(getValues).join(', ');        
, function(err, rows) {
...
});

如果我有一个值,它就很好用。在console.log(SQL(中,我可以看到:

SELECT * FROM names WHERE (name LIKE ?)

但是。。。如果我有多个值,比如:

{"name":[{"tag":"Peter"},{"tag":"Jack"}]}

我收到一个SQL错误:

sql: 'SELECT * FROM names WHERE (name LIKE '%Peter%', '%Jack%' OR name LIKE ?) }

所以第二个值不会到达第二个位置。

但结果应该是:

sql: 'SELECT * FROM names WHERE (name LIKE '%Jack%' OR name LIKE '%Peter%') }

所以在console.log(sql(中:

SELECT * FROM names WHERE (name LIKE ? OR name LIKE ?)

我缺少什么?我如何获得第二个值到第二个LIKE,依此类推?!

这里有一个类似的例子,但只有一个值:nodejs通过准备好的语句用类似mysql的查询抛出错误

此处生成的语句为'SELECT * FROM names WHERE (name LIKE '%Peter%', '%Jack%' OR name LIKE ?)的唯一原因

是您传递了一个值为[['%Peter%', '%Jack%']]的嵌套数组,而不是一个平面数组。

使用给定的对象,比如

const source = {"name":[{"tag":"Peter"}, {"tag":"Jack"}]}

那么准备好的语句的查询值应该是

const queryValues = source.name.map(({tag}) => `%${tag}%`);
// [ '%Peter%', '%Jack%' ]
connect.query(sql, queryValues, (err, rows) => {
});

最新更新