2017-07-24 51 views
0

我有使用JSON作为标记联合的数据,这样一个顶级对象只包含一个子对象。子对象的类型取决于父对象中的键名,而不是单独的“标记”字段,这在C结构中是正常的。在Postgres中获取JSON字段键名

例如

{"circle":{"radius":10}} 
{"square":{"side":10}}) 
{"rectangle":{"width":10,"height":20}}) 

这与JSON模式和协议缓冲区很好地工作。

我已阅读:https://www.postgresql.org/docs/9.6/static/functions-json.html

我在Postgres的JSON功能挣扎。我该如何做与下面的Javascript等效的SQL

Object.keys({"circle":{"radius":10}})[0]    (== `"circle") 
Object.keys({"square":{"side":10}})[0]     (== `"square") 
Object.keys({"rectangle":{"width":10,"height":20}})[0] (== `"rectangle") 

带有JSONB字段?

+0

这看起来很相关:https://stackoverflow.com/a/38347906/129805 – fadedbee

回答

1

有一个jsonb_object_keys,你可以使用它就像它的Javascript对应。例如:

SELECT jsonb_object_keys(json_column) 
FROM MyTable 

这显然会返回一个记录集。但是,如果您知道只有一个JSON对象中的一个键,那么只要使用它作为子查询(如果需要的话)。例如:

SELECT * 
FROM MyTable 
WHERE 'cicle' = (
    SELECT jsonb_object_keys(json_column) 
    FROM MyTable 
) 

编辑

你可以得到一个标值如下:

SELECT json_build_array(jsonb_object_keys(json_column)) -> 0 
FROM MyTable 

注意这是JSON(即"circle",不circle)。如果您需要文本值,请使用->>运算符。

+0

有没有办法获得第一个对象键,即将记录集转换为标量? – fadedbee

+0

我编辑了答案,把一个标量值的例子 –