我有一张桌子'文章'列'内容' 。我想查询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的数据类型
答案 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}%
]字符串文字替代函数调用中的最后一行。
这里发生了几件事,所以让我把每一行都分解掉。
SELECT * FROM users
users
关联的所有列 WHERE LOWER(users.name) LIKE $1
where
表的name
(小写)列像参数users
一样。 / li>
$1
ORDER BY users.id ASC
升序排列(即从0到无穷大,或者从低到高)。 users.id
表的id
列。客户端数据表示的一种流行替代方法是users
,它以相反的顺序按其创建日期显示最新用户(或更可能是文章/帖子/评论),因此您可以在页面顶部找到最新的内容。数组循环并显示在客户端。 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
自定义查询