2017-07-24 54 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

我編輯了答案,把一個標量值的例子 –