Ruby on rails 类似于Rails中Postgres JSON数组字段的查询
我有一个名为messages的表,它有一个名为headers的jsonB列来存储消息头。看起来是这样的:Ruby on rails 类似于Rails中Postgres JSON数组字段的查询,ruby-on-rails,json,postgresql,sql-like,psql,Ruby On Rails,Json,Postgresql,Sql Like,Psql,我有一个名为messages的表,它有一个名为headers的jsonB列来存储消息头。看起来是这样的: [ { "name":"Cc", "field":{ "name":"Cc", "value":"\"abc@gmail.com\" <abc@gmail.com>&
[
{
"name":"Cc",
"field":{
"name":"Cc",
"value":"\"abc@gmail.com\" <abc@gmail.com>",
"length":null,
"charset":"UTF-8",
"element":null,
"address_list":{
"addresses":[
{
"data":{
"raw":"\"abc@gmail.com\" <abc@gmail.com>",
"error":null,
"group":null,
"local":"abc",
"domain":"gmail.com",
"comments":[
],
"display_name":"abc@gmail.com",
"obs_domain_list":null
},
"parsed":true
}
],
"group_names":[
]
}
},
"charset":"UTF-8",
"field_order_id":14,
"unparsed_value":"\"abc@gmail.com\" <abc@gmail.com>"
},
{
"name":"Message-ID",
"field":{
"name":"Message-ID",
"uniq":1,
"value":"<sdasdasd+tkiCVQ@mail.gmail.com>",
"length":null,
"charset":"UTF-8",
"element":{
"message_ids":[
"sdasdasd+tkiCVQ@mail.gmail.com"
]
}
},
"charset":"UTF-8",
"field_order_id":16,
"unparsed_value":"<sdasdasd+tkiCVQ@mail.gmail.com>"
},
{
"name":"Subject",
"field":{
"name":"Subject",
"value":"Re: test email",
"errors":[
],
"length":null,
"charset":"UTF-8",
"element":null
},
"charset":"UTF-8",
"field_order_id":19,
"unparsed_value":"Re: test email"
}
]
但这是投掷错误 您可以执行子查询以获取需要比较的元素,然后在where子句中使用它们:
Message
.from(
Message.select("
id,
headers,
jsonb_array_elements(headers)->>'unparsed_value' AS unparsed_value,
jsonb_array_elements(headers)->>'name' AS name
"), :t
)
.select('t.*')
.where("t.name = 'Subject' AND t.unparsed_value LIKE '%test%'")
您需要的查询如下所示:
[
{
"name":"Cc",
"field":{
"name":"Cc",
"value":"\"abc@gmail.com\" <abc@gmail.com>",
"length":null,
"charset":"UTF-8",
"element":null,
"address_list":{
"addresses":[
{
"data":{
"raw":"\"abc@gmail.com\" <abc@gmail.com>",
"error":null,
"group":null,
"local":"abc",
"domain":"gmail.com",
"comments":[
],
"display_name":"abc@gmail.com",
"obs_domain_list":null
},
"parsed":true
}
],
"group_names":[
]
}
},
"charset":"UTF-8",
"field_order_id":14,
"unparsed_value":"\"abc@gmail.com\" <abc@gmail.com>"
},
{
"name":"Message-ID",
"field":{
"name":"Message-ID",
"uniq":1,
"value":"<sdasdasd+tkiCVQ@mail.gmail.com>",
"length":null,
"charset":"UTF-8",
"element":{
"message_ids":[
"sdasdasd+tkiCVQ@mail.gmail.com"
]
}
},
"charset":"UTF-8",
"field_order_id":16,
"unparsed_value":"<sdasdasd+tkiCVQ@mail.gmail.com>"
},
{
"name":"Subject",
"field":{
"name":"Subject",
"value":"Re: test email",
"errors":[
],
"length":null,
"charset":"UTF-8",
"element":null
},
"charset":"UTF-8",
"field_order_id":19,
"unparsed_value":"Re: test email"
}
]
从消息中选择*,其中
从jsonb_到_recordsetmessages.headers中选择true
作为xname文本,字段jsonb
其中name='Subject'
和字段->>“未分析的_值”,如“%test%”;
这会给你你想要的结果吗?它会返回空数组@SebastianPalma我相信问题中的headers列包含一个哈希数组。你的包含一个散列。对@Leslongtingill,刚刚更新。谢谢你指出这一点。成功了!我可以知道为什么需要对消息表进行自内查询吗?不是自内@Rivu join?,只是您需要以某种方式访问这两列/值,以便在where子句中使用它们。最常见的情况是认为可以在select语句中获得它们,但其中的值不能在where中使用,所以应该选择from。