|
Postgres具有此JSON数据类型,我想知道如何查询JSON数组中的数据?我正在使用Postgres 9.3.1
0 _! d8 a* E9 D2 u我已插入具有以下两个字段名称的PUBLISHER表:字符串和数据:json
! r) {8 S! H9 Z' j- r$ qINSERT INTO PUBLISHER (name, data) VALUES ('PUB1', [{"code":"A1","author":"James","type":"Novel"},{"code":"A2","author":"John","type":"Science"}]
: A, J' B0 I8 T* Z# [0 I# q/ `INSERT INTO PUBLISHER (name, data) VALUES ('PUB2', [{"code":"A1","author":"Dickens","type":"Novel"},{"code":"A2","author":"Tom","type":"Comic"}]# i- Z. n1 I2 h) ?
我想查询并列出类型为“小说”的作者。在这种情况下,应该是“ James”和“ Tom”作为输出。& ~6 p# N( b! r+ I$ a7 q; \
这种查询的内容:5 \; ~( e; }# R1 Z/ R5 ~
select name, authorfromdata from publisher where data->type is "Novel"# h, X3 S d) F/ \3 ^6 i
: R' _3 G& v( L* k) @9 A解决方案:0 ]* g3 F' ^' ?1 t: s( ^- }! F) x3 Q
4 s- w- o5 ^ f7 H0 s* L/ ~0 V3 z4 f4 Y
/ z# ^% |. e! y. F6 T4 p
您可以使用该json_array_elements函数SETOF json从数组生成:; v' F. r9 U" L) V( R1 p
SELECT name, json_array_elements(data) AS author- u$ x/ ~0 V4 o/ z0 F
FROM publisher! i/ r4 ]( r) K0 h8 d2 q
有了它,您可以将其用作子查询,这样就可以过滤所需的内容,例如:
# \/ P1 v2 H( y* A, R P& ~SELECT DISTINCT author->>'author'
: `# M9 m% P: R& L- uFROM (
2 u: W; k! h2 P8 R3 m SELECT name, json_array_elements(data) AS author
$ |3 p* R/ o/ p$ i3 I9 J FROM publisher7 J" ]" D- W+ B8 I3 ]: h# d
) t# e+ U5 c- ?. Q9 l, J% d
WHERE t.author->>'type' = 'Novel';
7 r3 ?+ y6 g* q- m# g2 r( w请注意,如果此表中有很多行,则此类查询的性能(至少对于当前版本为9.3)将非常糟糕。我建议您将数据标准化到表中。 |
|