2017-08-08 80 views
1

我有一個類型爲jsonb的列。此列中的數據看起來如下如何從jsonb列中選擇數據?

{ 
    "random_number1": 
    { 
     "random_number2": 
     { 
      "Param1": 2, 
      "Param2": 0, 
      "Param3": 0, 
      "Param4": 6, 
      "Param5": 3 
     } 
    } 
} 

如何爲該列寫入select如果我想f.e. 「Param3」= 6的所有行? 我試過類似的東西

SELECT * FROM table WHERE column->'Param3' @> '6'::jsonb; 

回答

2

這取決於您的期望。

獲取指定路徑的值:

select * 
from my_table 
where my_col->'random_number1'->'random_number2'->>'Param3' = '6' 

獲得第三級別的任何對象的關鍵Param3的價值:

select t.* 
from my_table t, 
jsonb_each(my_col) as level1(key1, value1), 
jsonb_each(value1) as level2(key2, value2) 
where jsonb_typeof(my_col) = 'object' 
and jsonb_typeof(value1) = 'object' 
and value2->>'Param3' = '6'; 

在第二種情況下,你可能想使用distinct,因爲查詢可能會產生重複的行。

+0

問題是,random_number1和random_number2總是不同的數值 – Jens

+0

因此,你有兩種變體的答案。使用第二個。 – klin

+0

但在第二種情況下,我收到了一個錯誤「無法在非對象上調用jsonb_each」 – Jens