Postgresql:搜索jsonb对象数组时如何使用动态值?
Posted
技术标签:
【中文标题】Postgresql:搜索jsonb对象数组时如何使用动态值?【英文标题】:Postgresql: How do I use dynamic values when searching jsonb array of objects? 【发布时间】:2021-09-14 14:44:08 【问题描述】:我目前正在尝试构建一个查询以在 jsonb 数组中查找特定对象。如果我为“游戏”值使用硬编码字符串,我有以下查询,例如
const findGameQuery = `
select playing
from users
where username = $1
and playing @> '["game": "new-pokemon-snap"]'
`
但是,如果我像当前对用户名一样使用动态值,则会收到无效的 json 语法错误。例如
const findGameQuery = `
select playing
from users
where username = $1
and playing @> '["game": $2]'
`
const rows = await query(findGameQuery, [username, game]);
ctx.body = rows
如何在此处使用动态值进行搜索?我进行了大量搜索,但找不到任何示例。 $2 值只是一个字符串,所以不确定为什么不被接受。
【问题讨论】:
【参考方案1】:当你发送这个查询时,它只有一个参数:
select playing
from users
where username = $1
and playing @> '["game": $2]'
正确的查询是:
select playing
from users
where username = $1
and playing @> $2
你必须用参数中的对象来制作数组。
const gameObj = [
"game": game
];
const gameParam = JSON.stringify(gameObj);
const rows = await query(findGameQuery, [username, gameParam]);
【讨论】:
啊,感谢您的解释和干净的代码。您是否知道是否可以只选择匹配的条目而不是整个表?【参考方案2】:您不能在字符串文字中使用参数。
使用 PostgreSQL 函数构造 jsonb
对象:
const findGameQuery = `
select playing
from users
where username = $1
and playing @> jsonb_build_array(jsonb_build_object('game', $2))
`
【讨论】:
以上是关于Postgresql:搜索jsonb对象数组时如何使用动态值?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 PostgreSQL 中的 JSONB 数组中获取特定对象的值?
如何将 JSON 对象推送到 postgresql 中 jsonb 列中的数组
在 postgresql、选项数组或对象中插入 jsonb 数据,有效方式