连续的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搜索包含value
或servicio_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,我希望它也返回行。
感谢您的帮助。
您需要取消嵌套数组并比较各个值:
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
进行不区分大小写的比较。