我正在使用PostgreSQL jsonb并在我的数据库记录中包含以下内容:
{"tags": "[\"apple\",\" orange\",\" pineapple\",\" fruits\"]",
"filename": "testname.jpg", "title_en": "d1", "title_ja": "1",
"description_en": "d1", "description_ja": "1"}
和两个以下的SELECT语句已经过了没有结果:
SELECT "photo"."id", "photo"."datadoc", "photo"."created_timestamp","photo"."modified_timestamp"
FROM "photo"
WHERE datadoc @> '{"tags":> ["apple"]}';
SELECT "photo"."id", "photo"."datadoc", "photo"."created_timestamp", "photo"."modified_timestamp"
FROM "photo"
WHERE datadoc -> 'tags' ? 'apple';
我想知道这是因为json数组字符串中添加了额外的反斜杠,或者SELECT语句不正确。
我正在运行" PostgreSQL 10.1,由Visual C ++ build 1800,64位"编译。在Windows 10上。
PostgreSQL doc是here。
答案 0 :(得分:1)
就任何JSON解析器而言,tags
键的值是一个字符串,而不是一个数组。
"tags": "[\"apple\",\" orange\",\" pineapple\",\" fruits\"]"
字符串本身恰好是另一个JSON文档,就像XML中的常见情况一样,字符串的内容恰好是XML或HTML文档。
["apple"," orange"," pineapple"," fruits"]
您需要做的是提取该字符串,然后将其解析为新的JSON对象,然后查询该新对象。
我现在无法测试,但我认为这看起来像这样:
(datadoc ->> 'tags') ::jsonb ? 'apple'
也就是说,"将标记值提取为text
,将text
值转换为jsonb
,然后查询新的jsonb
值。
答案 1 :(得分:0)
嘿,我知道这是一个很晚的答案,但这是一种很好的方法,可以处理我拥有的数据。
db中的初始数据:
"{\"data\":{\"title\":\"test\",\"message\":\"string\",\"image\":\"string\"},\"registration_ids\":[\"s
tring\"],\"isAllUsersNotification\":false}"
将其转换为json
从send_notification中选择(notificationData#>>'{}'):: jsonb
结果:
{"data": {"image": "string", "title": "string", "message": "string"}, "registration_ids": ["string"], "isAllUsersNotification": false}
从json获取数据对象
select(notificationData#>>'{}'):: jsonb->来自send_notification的'data';
结果:
{"image": "string", "title": "string", "message": "string"}
从以上结果中获取字段:
从send_notification中选择(notificationData#>>'{}'):: jsonb->'data'->>'title';
结果:
string
在哪里执行操作
Q:获取标题为“字符串”的记录
ans:
从send_notification中选择* where(notificationData#>>'{}'):: jsonb->'data'->>'title'='string'