【问题标题】:Postgres Node search query using LIKE, how to set %Postgres Node 搜索查询使用 LIKE,如何设置 %
【发布时间】:2020-02-17 15:46:45
【问题描述】:

我在使用 Postgresql 和 Node.js 时遇到了一个奇怪的问题。我想在我的查询中使用 LIKE 以及在搜索词的开头和结尾处使用 % 。在普通 SQL 中使用它没有问题:

这行得通:

SELECT * FROM vehicle WHERE module_imei LIKE '%searchterm%' OR custom_id LIKE '%searchterm%'

但是,在 Node 中使用它有点挑战。我还没有成功解决它: 这不起作用:

  getVehiclesSearch: async function({ search }) {
    let response;
    try {
      response = await pool.query(`SELECT * FROM vehicle WHERE module_imei LIKE %$1% OR custom_id LIKE %$1%`, [search]);
      if(response) return response.rows;
    } catch(error) {
      // handle error
      console.error(error);
      // do not throw anything
    }
  },

执行上述操作会产生:“%”处或附近的语法错误

SELECT * FROM vehicle WHERE module_imei LIKE '%${$1}%' OR custom_id LIKE '%${$1}%

执行上述操作会产生:$1 未定义

SELECT * FROM vehicle WHERE module_imei LIKE '%$1%' OR custom_id LIKE '%$1%'

以上操作会产生:bind message提供1个参数,但是prepared statement ""需要0个

我很难将 % 考虑在内,这样它就不会导致查询崩溃。在尝试上述方法和其中的变量之后,就没有想法了。感谢您的热心帮助。

【问题讨论】:

    标签: node.js postgresql


    【解决方案1】:

    这里已经回答了: Go postgresql LIKE query

    在这种特殊情况下:

          response = await pool.query(`SELECT * FROM vehicle WHERE module_imei LIKE '%'||$1||'%' OR custom_id LIKE '%'||$1||'%'`, [search]);
    

    这会起作用。

    【讨论】:

      【解决方案2】:

      您缺少单引号,我也不认识您使用的数据库适配器,但您可以使用模板文字(注意 sql 注入!!!)

      response = await pool.query(`SELECT * FROM vehicle WHERE module_imei LIKE '%${search}%' OR custom_id LIKE '%${search}%'`);
      

      【讨论】:

      • @I2ysho 谢谢你的帮助。我正在使用node-postgres.com/features/pooling,而sql注入预防正是在查询[搜索]的第二部分中。所以你的解决方案会起作用(也就是说,如果我不使用 $1,我正是因为你指出的(SQL 指令)而需要它。
      猜你喜欢
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 2016-03-18
      • 2012-06-17
      • 2011-10-04
      • 2011-11-05
      • 2019-10-09
      • 2014-10-18
      相关资源
      最近更新 更多