Javascript 通过为node.js mysql查询准备的语句提供多个通配符

Javascript 通过为node.js mysql查询准备的语句提供多个通配符,javascript,sql,node.js,Javascript,Sql,Node.js,我有这样一个JSON: {"name":[{"tag":"Peter"}]} var sqlVar; sqlVar += existParams.map(field => { if (field === 'name') { function getValues(item, index) { var getVal = [item.tag]; return `${field} LIKE ?`; }

我有这样一个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) {
    ...
});
我用多个通配符动态构建一个准备好的语句,如下所示:

{"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)中:

我遗漏了什么?我如何才能将第二个值转换为第二个值


下面是一个类似的示例,但只有一个值:

这里生成语句的唯一原因是
“从名称中选择*,其中(名称像\'%Peter%\'、\'%Jack%\'或名称像?

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

使用给定的对象,比如

const source = {"name":[{"tag":"Peter"}, {"tag":"Jack"}]}
然后,预处理语句的查询值应为

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

connect.query(sql, queryValues, (err, rows) => {
});

此处生成语句的唯一原因是
从名称中选择*(名称如\'%Peter%\'、\'%Jack%\'或名称如?

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

使用给定的对象,比如

const source = {"name":[{"tag":"Peter"}, {"tag":"Jack"}]}
然后,预处理语句的查询值应为

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

connect.query(sql, queryValues, (err, rows) => {
});

我想我们需要看看如何创建
sqlVar
这样的东西可能会起作用:
let results='name like'+name.map(getValues).join('OR name like')它将导致
名称像%Peter%或名称像%Jack%
。。。请参阅我上面关于sqlVar的编辑。。。。好。。。我可以直接在sqlVar中构建它。。。哪个有效。。。但它不再是预定义的语句了,不是吗?!我想我们需要看看如何创建
sqlVar
这样的东西可能会起作用:
let results='name like'+name.map(getValues).join('OR name like')它将导致
名称像%Peter%或名称像%Jack%
。。。请参阅我上面关于sqlVar的编辑。。。。好。。。我可以直接在sqlVar中构建它。。。哪个有效。。。但它不再是预定义的语句了,不是吗?!