错误:绑定消息提供1个参数,但准备好的语句""要求0

时间:2017-07-11 16:14:51

标签: sql node.js

我有一张桌子'文章'列'内容' 。我想查询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的数据类型

3 个答案:

答案 0 :(得分:3)

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

// 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

    • 这是从第一行中过滤掉所有结果,以便where表的name(小写)列像参数users一样。 / li>
  3. $1

    • 这是可选的,但我希望包含它,因为我希望返回的数据基于ORDER BY users.id ASC升序排列(即从0到无穷大,或者从低到高)。 users.id表的id列。客户端数据表示的一种流行替代方法是users,它以相反的顺序按其创建日期显示最新用户(或更可能是文章/帖子/评论),因此您可以在页面顶部找到最新的内容。数组循环并显示在客户端。
  4. users.created_at DESC

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

我知道这是一个非常晚的回复,但是我想以更彻底的回答进行回复,以防有人 进一步分解。

答案 1 :(得分: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 :(得分:0)

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

自定义查询