1

我正在使用 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语句不正确。

我在 Windows 10 上运行“PostgreSQL 10.1,由 Visual C++ build 1800 编译,64 位”。

PostgreSQL 文档在这里

4

2 回答 2

2

就任何 JSON 解析器而言,您的tags键值是一个字符串,而不是一个数组。

"tags": "[\"apple\",\" orange\",\" pineapple\",\" fruits\"]"

字符串本身恰好是另一个 JSON 文档,就像 XML 中的常见情况,其中字符串的内容恰好是 XML 或 HTML 文档。

["apple"," orange"," pineapple"," fruits"]

您需要做的是提取该字符串,然后将其解析为新的 JSON 对象,然后查询该新对象。

我现在无法测试它,但我认为它看起来像这样:

(datadoc ->> 'tags') ::jsonb ? 'apple'

也就是说,“将标签值提取为text,将该text值转换为jsonb,然后查询该新jsonb值。

于 2018-03-28T09:04:13.547 回答
1

嘿,我知道这是很晚的答案,但这是一个很好的方法,我有数据。

数据库中的初始数据:

 "{\"data\":{\"title\":\"test\",\"message\":\"string\",\"image\":\"string\"},\"registration_ids\":[\"s
tring\"],\"isAllUsersNotification\":false}"

将其转换为 json

select (notificationData #>> '{}')::jsonb from sent_notification

结果:

 {"data": {"image": "string", "title": "string", "message": "string"}, "registration_ids": ["string"], "isAllUsersNotification": false}

从 json获取数据对象

select (notificationData #>> '{}' )::jsonb -> 'data' from sent_notification;

结果:

 {"image": "string", "title": "string", "message": "string"}

从上面的结果中得到一个字段:

select (notificationData #>> '{}' )::jsonb -> 'data' ->>'title' from sent_notification;

结果:

 string

执行 where 操作,

问:获取title ='string'的记录

答:

select * from sent_notification where (notificationData #>> '{}' )::jsonb -> 'data' ->>'title' ='string'

于 2020-05-13T04:11:48.570 回答