Postgres查询包含内容的JSON数组

Axi*_*xil 5 sql postgresql json ruby-on-rails postgresql-9.2

Postgres有这个JSON数据类型,我想知道如何在JSON数组中查询数据?我正在使用Postgres 9.3.1

我已插入到PUBLISHER表中,其中包含以下两个字段的名称:string和data:json

INSERT INTO PUBLISHER (name, data) VALUES ('PUB1', [{"code":"PA1","author":"James","type":"Novel"},{"code":"PA2","author":"John","type":"Science"}] 

INSERT INTO PUBLISHER (name, data) VALUES ('PUB2', [{"code":"PA1","author":"Dickens","type":"Novel"},{"code":"PA2","author":"Tom","type":"Comic"}] 
Run Code Online (Sandbox Code Playgroud)

我想查询并列出"Novel"类型的作者.在这种情况下,应该是输出的"詹姆斯"和"汤姆".

这种查询的东西:

select name, authorfromdata from publisher where data->type is "Novel"
Run Code Online (Sandbox Code Playgroud)

Mat*_*sOl 6

您可以使用该json_array_elements函数SETOF json从数组生成:

SELECT name, json_array_elements(data) AS author
FROM publisher
Run Code Online (Sandbox Code Playgroud)

有了它,你可以将它用作子查询,这样你就可以过滤你想要的东西,例如:

SELECT DISTINCT author->>'author'
FROM (
    SELECT name, json_array_elements(data) AS author
    FROM publisher
) t
WHERE t.author->>'type' = 'Novel';
Run Code Online (Sandbox Code Playgroud)

请注意,如果此表中有许多行,则此类查询的性能(至少对于当前版本9.3)将非常糟糕.我建议你将数据规范化为表格.