我有一个名为 messages
的表,其中有一个名为 headers
的 jsonB
列来存储消息 header 。它看起来像这样:
[
{
"name":"Cc",
"field":{
"name":"Cc",
"value":"\"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d7b6b5b497b0bab6bebbf9b4b8ba" rel="noreferrer noopener nofollow">[email protected]</a>\" <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1776757457707a767e7b3974787a" rel="noreferrer noopener nofollow">[email protected]</a>>",
"length":null,
"charset":"UTF-8",
"element":null,
"address_list":{
"addresses":[
{
"data":{
"raw":"\"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5130333211363c30383d7f323e3c" rel="noreferrer noopener nofollow">[email protected]</a>\" <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="92f3f0f1d2f5fff3fbfebcf1fdff" rel="noreferrer noopener nofollow">[email protected]</a>>",
"error":null,
"group":null,
"local":"abc",
"domain":"gmail.com",
"comments":[
],
"display_name":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2d4c4f4e6d4a404c4441034e4240" rel="noreferrer noopener nofollow">[email protected]</a>",
"obs_domain_list":null
},
"parsed":true
}
],
"group_names":[
]
}
},
"charset":"UTF-8",
"field_order_id":14,
"unparsed_value":"\"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="94f5f6f7d4f3f9f5fdf8baf7fbf9" rel="noreferrer noopener nofollow">[email protected]</a>\" <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ea8b8889aa8d878b8386c4898587" rel="noreferrer noopener nofollow">[email protected]</a>>"
},
{
"name":"Message-ID",
"field":{
"name":"Message-ID",
"uniq":1,
"value":"<<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="92e1f6f3e1f6f3e1f6b9e6f9fbd1c4c3d2fff3fbfebcf5fff3fbfebcf1fdff" rel="noreferrer noopener nofollow">[email protected]</a>>",
"length":null,
"charset":"UTF-8",
"element":{
"message_ids":[
"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="daa9bebba9bebba9bef1aeb1b3998c8b9ab7bbb3b6f4bdb7bbb3b6f4b9b5b7" rel="noreferrer noopener nofollow">[email protected]</a>"
]
}
},
"charset":"UTF-8",
"field_order_id":16,
"unparsed_value":"<<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="097a6d687a6d687a6d227d62604a5f584964686065276e64686065276a6664" rel="noreferrer noopener nofollow">[email protected]</a>>"
},
{
"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"
}
]
我想要搜索 'name' = 'Subject' 和 'unparsed_value' 的记录(如 %test%
)并在 Rails 6.0.2 中返回结果?
我正在尝试下面提到的代码:
messages.where("headers @> '[{\"name\": \"Subject\"}, {\"unparsed_value\" LIKE \"%test%\"}]'")
但它抛出错误!
最佳答案
您可以执行子查询来获取需要比较的元素,然后在 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%'")
关于ruby-on-rails - Rails 中 Postgres JSON 数组字段的 LIKE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62759600/