Sql JSONB中的Postgres搜索
行中的自定义字段如下所示:Sql JSONB中的Postgres搜索,sql,json,postgresql,postgresql-10,Sql,Json,Postgresql,Postgresql 10,行中的自定义字段如下所示: [ { "value":"Test Name", "display_name":"Name", "servicio_tags":[ "person-name" ] }, { "value":"", "display_name":"Telefonnummer", "servicio_tags":[ "phone" ]
[
{
"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是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与键值完全相同时返回行。如果value键的值仅包含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
来进行不区分大小写的比较