【问题标题】:IN clause in mysql nodejsmysql nodejs中的IN子句
【发布时间】:2017-06-15 13:52:14
【问题描述】:

我有一个简单的 nodejs 应用程序,它执行以下查询。

select * from User where userid in (?)

我得到的用户 ID 是从客户端发送的 JSON 数组。我如何在这个选择查询中使用它?我试过了 1.作为本身但不工作。 2.把这个转成Javascript数组,不行

【问题讨论】:

  • 分享代码。
  • 你可以这样做:select * from User where userid in (?,?,?,?)

标签: mysql node.js


【解决方案1】:

如果您将数组传递给参数,则它适用于节点mysql2。参数已经作为数组传递,所以你的第一个参数需要是数组[[1,2,3]]

select * from User where userid in (?)
const mysql = require('mysql2/promise');

async function main(){
  let db = await mysql.createPool(process.env.MYSQL_URL);
  let SQL = 'select * from User where userid in (?)';

  let [res, fields] = await db.query(SQL, [[1,2,3]]);
  console.log(res)
  return res;
}

main().then(() => {process.exit()})

【讨论】:

    【解决方案2】:

    更新:请参阅this answer。这是执行问题中所要求的正确方法。

    我尝试过的方法是:

    1. 将 JSON 数组扩展为所需格式的字符串。使用“+”将其与查询连接起来。 (小心 SQL 注入)
    2. 动态添加“?”使用保存用户 ID 的 JSON 数组的长度。然后使用数组提供用户 ID。

    两者都有效。然后我用更好的方法改变了我的逻辑,所以现在我不再需要 then 'in' 子句了。

    【讨论】:

    • 我是这么认为的。抱歉,我忘了在答案中添加。这就是我改变方法的原因。
    【解决方案3】:
    let val = ["asd","asd"]
    let query = 'select * from testTable where order_id in (?)';
    connection.query(query, [val], function (err, rows) {
    });
    

    在Node中,需要将数组放入数组中。

    【讨论】:

      【解决方案4】:

      // 获取带逗号的查询字符串数据 var param=req.params['ids'];

      //damy data var param = [1,2,3,4,5];
      

      var array = params.split(",").map(Number);

      //注意在选择查询中不要使用“和'(引号和撇号)
      // 只需使用 `(重音)在键盘上的第一个数字键之前关闭数字键

      con.query(`select * from TB_NAME where COL IN(?)`,[array],(err,rows,fields)=>{
      

      res.json(行); });

      【讨论】:

      • 添加一些解释,说明此答案如何帮助 OP 解决当前问题
      【解决方案5】:

      如果您使用像mysql 这样的节点模块,则第二种方法应该可以工作。

      var query=select * from User where userid in (?);
      var data=['a','b','c'];
      var queryData=[data];
      
      conn.query(query, queryData, function (err, results) {})
      

      根据documentation,“数组变成了列表,例如['a', 'b'] 变成了'a', 'b'”。所以这种方法应该可行(我已经实际使用过)。

      【讨论】:

      • 实际上,当参数为 [5,[17,22,67,85,105,161,166,170,180,197,198]] 以及何时为 [5,["17","22"," 67","85","105","161","166","170","180","197","198"]] 查询以WHERE tto.tariff_id=? AND so.service_opt_id IN (?) 结尾,这些是唯一的问号
      【解决方案6】:

      这样的事情可能会奏效!

      // get your possible IDs in an array
      var ids = [1,2,3,4,5];
      
      // then, create a dynamic list of comma-separated question marks
      var tokens = new Array(ids.length).fill('?').join(',');
      
      // create the query, passing in the `tokens` variable to the IN() clause
      var query = `SELECT * FROM User WHERE userid IN (${tokens})`;
      
      // perform the query
      connection.query(query, ids, (err, data) => {
         // do something with `err` or `data`
      });
      

      【讨论】:

        【解决方案7】:

        重新审视这一点,因为该问题的原始方法是有效的,但有一些警告。如果您唯一的转义参数是 IN 子句中的参数,那么您必须将其指定为嵌套数组;类似于:[['usrId1', 'usrId2', 'usrIdN']]。这是因为非转义功能需要一个数组,替换每个“?”与相应的数组元素。所以,如果你想替换你唯一的“?”对于数组,该数组应该是传递的所有参数的第一个元素。如果您有多个“?”,则语法更直观,但最终一致且相同;在这种情况下,您的参数可能类似于: ['myOtherArgument1', 'myOtherArgument2', ['usrId1', 'usrId2', 'usrIdN'], 'myOtherArgument3']

        【讨论】:

          【解决方案8】:

          你可以这样做: select * from User where userid in (?,?,?,?)

          var array = []; 
          array.push(value);
          array.push(value);
          array.push(value);
          array.push(value);
          

          然后使用数组作为应该绑定的参数。

          【讨论】:

          • 这对于具有恒定大小的数组来说很好,但是如果大小可以变化呢?
          • 你必须添加?我在项目中使用的动态
          • 我将 json 数组扩展为所需格式的字符串,然后只使用 + 查询字符串。这是不好的方法吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-11-26
          • 2014-09-20
          • 1970-01-01
          • 2015-04-02
          • 1970-01-01
          • 2010-12-07
          • 1970-01-01
          相关资源
          最近更新 更多