2014-01-20 92 views
2

我们可以使用->->>运算符来访问PostgreSQL 9.3中的任何JSON元素。在我看来,#>以及#>>只提供了一种较短的写入JSON路径的形式。或者#>运营商背后有更大的图片吗?它是否有特殊用途/提供箭头符号的优势?哪一个是写路径的优先方法?PostgreSQL中#>和 - >>运算符有什么区别?

这一切都来了一个问题:为什么我应该使用#>#>>运营商通过->->>

The docs对此有点神秘。下面

两个查询产生相同的结果:

=> select '{"a":[1,2,3],"b":[4,5,6]}'::json#>'{a,2}'; 
?column? 
---------- 
3 

=> select '{"a":[1,2,3],"b":[4,5,6]}'::json->'a'->>2; 
?column? 
---------- 
3 

回答

2

考虑嵌套。

{ 
    "a" : { 
    "b" : { 
     "c" : 1, 
     "d" : 2 
    } 
    } 
} 

假设你有一个JSON文件,你事先不知道如何将其嵌套。如果你知道你需要三级路径,你可以写:

SELECT '{ 
    "a" : { 
    "b" : { 
     "c" : 1, 
     "d" : 2 
    } 
    } 
}'::json -> 'a' -> 'b' -> 'c'; 

但是如果你想写一个事先不知道的查询呢?这就是基于路径的操作员有用的地方;该路径可以与文档一起提供,并且不再对查询中的文档结构进行任何假设。

SELECT '{ 
    "a" : { 
    "b" : { 
     "c" : 1, 
     "d" : 2 
    } 
    } 
}'::json #>> ARRAY['a','b','c']