2017-05-08 81 views
1

称为test如下定义选择对象键

Column | Type | Modifiers 
--------+------+----------- 
a  | json | 

其中每一行有一些JSON类似于

{ 
    "1": "abc", 
    "2": "def", 
    "3": "ghi" 
} 

形式我怎么能做出一个查询,选择键最大的值? (在这个例子中,你会选择"ghi"因为它是关键,3,是最大的)


我概念化的方式,理想情况下它会是这样的查询:

SELECT a->max(json_object_keys(a)) from test; 

但显然这是行不通的。这可能吗?

回答

1

运行让我们尝试解决增量问题:

tometzky=> select * from json_object_keys('{"1": "abc","2": "def","3": "ghi"}'::json) as k; 
k 
--- 
1 
2 
3 
(3 rows) 

tometzky=> select max(k) from json_object_keys('{"1": "abc","2": "def","3": "ghi"}'::json) as k; 
max 
----- 
3 
(1 row) 

tometzky=> create temporary table test (a json); 
tometzky=> insert into test values('{ 
    "1": "abc", 
    "2": "def", 
    "3": "ghi" 
}'); 
tometzky=> insert into test values('{ 
    "100": "jkl", 
    "20": "kmo", 
    "3": "pqr" 
}'); 

tometzky=> select (select max(k) from json_object_keys(a) as k) from test; 
max 
----- 
3 
3 
(2 rows) 

tometzky=> select (select max(k::int) from json_object_keys(a) as k) from test; 
max 
----- 
    3 
100 
(2 rows) 

所以答案是:

tometzky=> select a->(select max(k::int)::text from json_object_keys(a) as k) from test; 
?column? 
---------- 
"ghi" 
"jkl" 
(2 rows) 

我假设“每个行的”最大关键值“是,因为它看起来不像一个明确定义的问题。

1

你可以json_each这样做:

select value 
from  ( select (json_each(a)).* 
      from test 
     ) keyval 
order by key::int desc 
limit 1; 

看到它在rextester.com