2016-08-30 35 views
4

提取元件通過使用jsonb_array_elements()函數提取出從Postgres的jsonb數據陣列,它給了錯誤:提取JSON數組給出錯誤:不能從一個標量

cannot extract elements from a scalar

我假定它是由於NULL在回電時,增加了NULL檢查條件但不起作用。任何幫助讚賞。

select id , 
    CASE 
    WHEN report IS NULL OR 
     (report->'stats_by_date') IS NULL OR 
     (report->'stats_by_date'-> 'date') IS NULL then to_json(0)::jsonb 
    ELSE jsonb_array_elements(report -> 'stats_by_date' -> 'date') 
    END AS Date 
    from factor_reports_table 

截斷的JSON數組的樣子:

"stats_by_date": {"date": [16632, 16633, 16634, ...], "imps": [2418, 896, 1005...], ...}

+0

請提供您的示例json值。錯誤似乎很清楚。傳遞給'jsonb_array_elements'的值是一個標量,而不是一個json數組。 –

+0

「stats_by_date」:{「date」:[16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651 ,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674],「imps」,「1」,「1」 「:[2418,896,1005 ...],...} –

+0

它適用於多個條目的限制,如果在所有數據表上循環,則會出現錯誤,因此可能會傳遞一些空/標量到'jsonb_array_elements'函數。想知道如何檢查並繞過它 –

回答

3

在你的數據必須有一些標值,而不是內部date鍵的數組。

您可以用jsonb_typeof()來識別哪種類型是特定的密鑰,然後將其包含在CASE語句中。

考慮例如標量和數組下面爲您輸入設置:

select 
    case when jsonb_typeof(jsonb_column->'stats_by_date'->'date') = 'array' 
     then jsonb_array_elements(jsonb_column->'stats_by_date'->'date') 
     else jsonb_column->'stats_by_date'->'date' 
    end as date 
from (
    select '{"stats_by_date": {"date": 123}}'::jsonb -- scalar (type: 'number') 
    union all 
    select '{"stats_by_date": {"date": [456]}}'::jsonb -- array (type: 'array') 
) foo(jsonb_column); 

結果

date 
------ 
123 
456 

所以,你的查詢需要這樣寫來處理這樣的情況:

select id, 
    case when jsonb_typeof(jsonb_column->'stats_by_date'->'date') = 'array' 
     then jsonb_array_elements(jsonb_column->'stats_by_date'->'date') 
     else jsonb_column->'stats_by_date'->'date' 
    end as date 
from factor_reports_table 
+0

這是行得通的!非常感謝。 –

相關問題