首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索JSONB数据GORM & PostgreSQL

问搜索JSONB数据GORM & PostgreSQL
EN

Stack Overflow用户
提问于 2022-06-09 02:05:29
回答 2查看 190关注 0票数 0

如何使用GORM访问JSONB数据类型并搜索其中嵌套的数据?

让我们假设表产品有包含JSONB类型的info列,如下所示:

代码语言:javascript
复制
{
 "ID": 1,
 "NAME": "Product A",
 "INFO": {
  "DESCRIPTION": "lorem ipsum",
  "BUYERS": [
   {
   "ID": 1,
   "NAME": "John Doe"
   },
   {
   "ID": 2,
   "NAME": "Jane Doe"
   }
  ]
 }
}

从存储在PostgreSQL中的JSONB中,我希望通过买家的名字搜索产品,如果其中任何一个匹配的话。

因此,起作用的PostgreSQL查询应该是:

代码语言:javascript
复制
SELECT * FROM products WHERE info -> 'buyers' @> '[{"name": "Jane Doe"}]'

我和戈姆试过了,但没有用:

代码语言:javascript
复制
result = db.Where("info-> 'buyers' @> '[{\"name\": ?}]'", request.body.name).Find(&products)

获得错误和SQL查询输出的地方如下所示:

代码语言:javascript
复制
SELECT * FROM "products" WHERE info -> 'buyers' @> '[{"name": 'Jane Doe'}]'
ERROR: invalid input syntax for type json (SQLSTATE 22P02)

GORM查询生成器似乎使用单引号而不是双引号的字符串类型,从而导致JSONB搜索的错误--应该是"name": "Jane Doe"而不是"name": 'Jane Doe'。

因此,如何将单引号改为where子句值的双引号?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-10 06:41:09

在SQL中构建json字符串?

代码语言:javascript
复制
result = db.Where("info -> 'buyers' @> '[{\"name\": \"' || ? || '\"}]'", request.body.name).Find(&products)

这将创建SQL..。

代码语言:javascript
复制
SELECT * FROM products WHERE info -> 'buyers' @> '[{"name": "' || 'Jane Doe' || '"}]'
票数 1
EN

Stack Overflow用户

发布于 2022-06-10 06:29:00

有时,GORM在执行复杂查询或某些还不支持的内容时会生成不需要的SQL。为了确保GORM为您生成正确的SQL,您可以使用.ToSQL函数检查它,也可以使用.Raw和.Scan创建原始查询,以完成GORM尚未支持的事情。

代码语言:javascript
复制
db.Raw("SELECT * FROM products WHERE info -> 'buyers' @> '[{\"name\": \"Jane Doe\"}]'").Scan(&result)

https://gorm.io/docs/sql_builder.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72553978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档