【问题标题】:error: bind message supplies 1 parameters, but prepared statement "" requires 0错误:绑定消息提供 1 个参数,但准备好的语句“”需要 0
【发布时间】:2017-07-11 16:14:50
【问题描述】:

我有一个表 'article' 列 'content' 。我想查询 Postgresql 以搜索包含在变量 'temp' 中的字符串。此查询工作正常-

pool.query("select * from article where upper(content) like upper('%some_value%')");

但是当我使用占位符 $1 和 [temp] 代替 some_value 时,我得到了上述错误 -

pool.query("select * from article where upper(content) LIKE upper('%$1%')",[temp] );

注意 - 这里 $1 是一个占位符,应该替换为 [temp] 中的值,但我猜它会将 '%$1%' 视为字符串。没有引号 ' ' ,LIKE 运算符不起作用。我也试过查询 -

pool.query("select * from article where upper(content) LIKE upper(concat('%',$1,'%'))",[temp] );

确保 $1 不被视为字符串文字,但它给出了错误 - 错误:无法确定参数 $1 的数据类型

【问题讨论】:

  • 你安装了哪些版本的节点和包?
  • node 7.7.1 ,其他包也是最近的,因为我前几天安装的。
  • 我无法重现错误消息,但以下答案对您的情况很有意义:stackoverflow.com/a/26209691/674225。即:SQL 使用 ' 作为字符串文字。
  • 您的意思是我发布的第二个查询在您的系统上运行良好?此外,您提供的答案链接只是建议应使用不带引号的占位符,但我不认为 SQL 的 LIKE 运算符不带引号也能工作......
  • 参数符号肯定需要在引号之外。我没有尝试过concat 版本,我认为它可以工作,但是——就像你知道的——没有。发现||解决了问题并提交了答案。

标签: sql node.js


【解决方案1】:
pool.query(
  "select * from article where upper(content) LIKE upper('%' || $1 || '%')",
  [temp]
).then( res => {console.log(res)}, err => {console.error(err)})

这对我有用。我只是查看this Postgres doc page 来尝试了解concat 对参数表示法所做的事情。不能说我现在理解使用||操作符和使用concat字符串函数的区别。

【讨论】:

    【解决方案2】:

    我发现的最简单的方法如下:

    // You can remove [0] from character[0] if you want the complete value of character.
      database.query(`
        SELECT * FROM users 
        WHERE LOWER(users.name) LIKE LOWER($1)
        ORDER BY users.id ASC`, 
        ["%" + character[0] + "%"]
      );
    
    

    // [%${character}%] 字符串文字替代函数调用中的最后一行。


    这里发生了几件事,所以让我把每一行都分解一下。

    1. SELECT * FROM users

      • 这是选择与表users关联的所有列
    2. WHERE LOWER(users.name) LIKE $1

      • 这是从第一行过滤掉所有结果,以便users 表的name(小写)列的where 类似于参数$1
    3. ORDER BY users.id ASC

      • 这是可选的,但我喜欢包含它,因为我希望返回给我的数据是基于 users.id 或 @ 的升序(即从 0 到无穷大,或者从低到高) users 表的 987654332@ 列。客户端数据呈现的一个流行替代方案是users.created_at DESC,它以相反的顺序显示最新用户(或很可能是一篇文章/帖子/评论)的创建日期,以便您在数组顶部获得最新内容循环并显示在客户端。
    4. ["%" + character + "%"]

      • 这部分是从数据库对象调用的 .query 方法中的第二个参数(或 client,如果您保留该名称,您可以随意命名,对我来说,数据库比“客户”,但这只是我个人的看法,“客户”很可能是技术上更正确的术语)。 第二个参数需要是一个值数组。它代替插入到查询字符串中的参数,例如,$1? 是参数占位符的示例,它们用第二个参数的值数组中的值填充。在这种情况下,我使用 JavaScript 的内置字符串连接来提供“包含”like 模式,或者用简单的英语,“查找包含'this' 值”,其中name(小写)是列,character 是参数变量值。我正在从req.params(URL,所以http://localhost:3000/users/startsWith/t)中提取character 变量的参数值,因此将其与参数两端的% 结合起来,它会返回所有包含字母 t 因为是 URL 中的第一个(也是唯一一个)字符。

    我知道这是一个非常晚的回复,但我想回复一个更全面的答案,以防有人其他需要进一步分解。

    【讨论】:

      【解决方案3】:

      就我而言: 我的变量是 $1,而不是 ?1 ... 我正在使用 @Query 自定义查询

      【讨论】:

        猜你喜欢
        • 2015-06-23
        • 1970-01-01
        • 2013-08-09
        • 2014-11-30
        • 1970-01-01
        • 2020-06-24
        • 2017-05-14
        • 2021-08-01
        • 2020-05-29
        相关资源
        最近更新 更多