PostgreSQL jsonb字符串格式

时间:2018-03-28 06:39:38

标签: json postgresql jsonb postgresql-10

我正在使用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

2 个答案:

答案 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'