繁体   English   中英

在 Rails 中对 Postgres JSON 数组字段进行 LIKE 查询

[英]LIKE Query on Postgres JSON array field in Rails

我有一个名为messages的表,其中有一个名为headersjsonB列来存储消息头。 它看起来像这样:

[
   {
      "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"
   }
]

我想要像%test%这样的 'name' = 'Subject' 和 'unparsed_value' 的搜索记录并在 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%'")

您需要的查询如下所示:

SELECT * FROM messages WHERE 
  (SELECT true FROM jsonb_to_recordset(messages.headers)
    AS x(name text, field jsonb)
    WHERE name = 'Subject'
    AND field->>'unparsed_value' LIKE '%test%');

这会给你想要的结果吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM