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

asd*_*sdf 3 sql node.js

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

pool.query("select * from article where upper(content) like upper('%some_value%')");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Mar*_*ius 5

pool.query(
  "select * from article where upper(content) LIKE upper('%' || $1 || '%')",
  [temp]
).then( res => {console.log(res)}, err => {console.error(err)})
Run Code Online (Sandbox Code Playgroud)

这对我有用。我只是查看了这个 Postgres 文档页面,试图了解concat参数符号的作用。不能说我此时理解使用||运算符和使用concat字符串函数的区别。


brf*_*f19 5

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

// 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] + "%"]
  );

Run Code Online (Sandbox Code Playgroud)

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


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

  1. SELECT * FROM users

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

    • 这是从第一行过滤掉所有结果,以便表wherename(小写)列users就像参数$1
  3. ORDER BY users.id ASC

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

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

我知道这是一个非常晚的回应,但我想以更彻底的答案回应,以防其他需要进一步分解。