共计 1869 个字符,预计需要花费 5 分钟才能阅读完成。
1. 操作键值对
PostgreSQL 对 jsonb 类型的筛选查询可以使用 ->
或者 ->>
操作符。
->
操作符用于通过 JSON 对象中的键来获取对应的值。->>
操作符可以将获取到的值 提取出来 转化为字符串类型。
例如,下面是一个包含 jsonb 类型字段的表:
CREATE TABLE test (
id SERIAL PRIMARY KEY,
data JSONB
);
INSERT INTO test (data) VALUES ('{"name":"John","age": 30,"city":"New York"}');
INSERT INTO test (data) VALUES ('{"name":"Jane","age": 25,"city":"Los Angeles"}');
我们可以通过下面这中查询方式进行全库的全文检索查询
-- 获取所有数据
SELECT * FROM test;
-- 根据 jsonb 字段中的键值进行查询
SELECT * FROM test WHERE data -> 'name' = '"John"';
-- 注意:键名需要用单引号括起来,并且值需要用双引号括起来。-- 使用 ->> 将键对应的值提取出来进行查询
SELECT * FROM test WHERE data ->> 'age' = '30';
上面这个提取出来的例子可能不明显
下面添加一个复杂的 json 例子
{
"caseInfo": {
"caseNo": "C20xxxxxxxxx8212566",
"reportNo": "P2xxxxxxxxxxxxxxxxx3004",
"applyTime": 17xxxxxxxxx5000,
"companyId": 1xx00,
"treatType": "1",
"createFrom": 1xxx1,
"companyName": "中国 xxxxxxxxxxx 公司",
"processType": "2xx",
"accidentDate": 171xxxxxxxx1000,
"accidentType": "xx1x",
"hospitalCode": "xxxxxxxxx35",
"hospitalName": "台 xxxxxxxxxxxx 院",
"hospitalLevel": "","medicalFinish":"",
"firstCompanyId": 0987654,
"injuredFromArea": "ytgrefds",
"insuranceTypeId": "","firstCompanyName":" 中 xxxxxxxxxxxx 限公司 ","hospitalAttribute":"",
"uploadUserOrgCode": "","totalSettlementAmount": 0
},
"patientInfo": {
"name": "邱 76y5t432",
"idCard": "33sacdvfgbdcs1232675",
"address": "asadfghfdsa 村",
"birthday": sadcsxazxsc000,
"cardType": "asdsad",
"idDueDay": 2asxcv bgdfsc000,
"genderCode": "1"
},
"applyUserInfo": {
"nationality": "CHN",
"applyUserName": "","applyUserIdCard":"",
"applyUserBirthday": "","applyUserCardType":"",
"applyUserIdDueDay": "","applyUserGenderCode":"",
"applyUserPatientRelation": ""
}
}
这个时候提取的作用就显得明显了很多
-- ->> 提取测试 sql, 将 applyUserInfo 下的 nationality 提取出来,做一维 sql 标准查询
SELECT count(*)
FROM case_service.cs_case_model
WHERE (cs_case_model.case_model_detail -> 'applyUserInfo' ->> 'nationality') like '%C%';
结果:
原文地址: PG 数据库的 Jsonb 全文检索查询
正文完