JSONB中的Postgres搜索

问题描述 投票:0回答:1

连续的custom_fields字段如下所示:

[
   {
      "value":"Test Name",
      "display_name":"Name",
      "servicio_tags":[
         "person-name"
      ]
   },
   {
      "value":"",
      "display_name":"Telefonnummer",
      "servicio_tags":[
         "phone"
      ]
   },
   {
      "value":"test@test.net",
      "display_name":"E-Mail",
      "servicio_tags":[
         "e-mail"
      ]
   },
   {
      "value":"Sonnberg 170",
      "display_name":"Adresse",
      "servicio_tags":[
         "address"
      ]
   },
   {
      "value":"1/",
      "display_name":"Personen Anzahl",
      "servicio_tags":[
         "person-number-info"
      ]
   },
   {
      "value":"",
      "display_name":"Notiz",
      "servicio_tags":[
         "trace"
      ]
   },
   {
      "value":"A la Carte",
      "display_name":"Typ",
      "servicio_tags":[
         "price-type"
      ]
   },
   {
      "value":"Montag, 11. Mai 2020 19:30",
      "display_name":"Anreise",
      "servicio_tags":[
         "arrival"
      ]
   },
   {
      "value":"Montag, 11. Mai 2020 20:30",
      "display_name":"Abreise",
      "servicio_tags":[
         "departure"
      ]
   },
   {
      "value":"2020-05-11 19:30",
      "display_name":"Ankunft bei Reservierung",
      "servicio_tags":[
         "arrival",
         "hidden"
      ]
   },
   {
      "value":"2020-05-11 20:30",
      "display_name":"Abfahrt bei Reservierung",
      "servicio_tags":[
         "departure",
         "hidden"
      ]
   }
]

我想通过使用searchTerm搜索包含valueservicio_tags":["person-name"]的对象的servicio_tags":["full-name"]键的值来查询该数据库。

因此,如果searchTerm为a,则应将这一行还给我,因为JSON中的对象

{
      "value":"Anton Hoerl Jun.",
      "display_name":"Name",
      "servicio_tags":[
      "person-name"
      ]
},

满足此条件。

我的尝试:

const fullNameString = '%{"value": "' + searchTerm + '", "display_name": "Name", "servicio_tags": ["full-name"]}%';
const personNameString = '%{"value": "' + searchTerm + '", "display_name": "Name",
"servicio_tags": ["person-name"]}%';

const result = await this.db.query(
`SELECT * 
FROM guest_group
AND custom_fields::text like $2
OR custom_fields::text like $3 LIMIT 5`, [customerId, fullNameString, personNameString]);

此查询没有给我想要的结果,因为它仅在seachTerm与键值的值完全相同时才返回行。如果值键的值仅包含searchTerm,我希望它也返回行。

感谢您的帮助。

sql json postgresql postgresql-10
1个回答
1
投票

您需要取消嵌套数组并比较各个值:

select g.*
from guest_group g
where exists (select *
              from jsonb_array_elements(g.custom_fields) as f(element)
              where f.element ->> 'value' ilike 'a%');

注意,我使用ilike进行不区分大小写的比较。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.