2016-11-20 67 views
0

我正在使用PostgreSQL 9.5和JSONB數據類型來存儲文檔。我的表是這樣的:如何使用Postgres jsonb在數組內搜索對象值?

create table records (
    id serial, 
    data jsonb 
); 

我的文檔包含對象的數組,例如:

{ 
    "some_field": "a value", 
    "another_field": 123, 
    entries: [ 
    { 
     "name": "John Doe", 
     "age": 42 
    }, 
    { 
     "name": "Johnny McMuffin", 
     "age": 117 
    } 
    ] 
} 

的問題是,我希望能夠在entriesname屬性過濾器數組,我只是無法弄清楚。我希望能夠在我的表中找到部分與對象列表中的某個名稱匹配的行。

我讀了很多關於索引和表達式的東西,但我似乎無法讓它工作。這不可能嗎?

回答

1

這是我不清楚預期的結果是什麼,但像這樣將工作:

select r.id, e.* 
from records r 
    cross join lateral jsonb_array_elements(r.data -> 'entries') as e 
where e ->> 'name' like '%Doe%'; 

爲了能夠將每個數組元素訪問你需要「UNNEST」他們(即正常化非規範化文件)。請注意,以上內容將爲每個匹配數組元素返回一行,而不是針對表中的每一行。

您還可以移動的名稱檢查到存在子查詢,如果你需要從基礎表中是唯一完整行:

select r.* 
from records r 
where exists (select 1 
      from jsonb_array_elements(r.data -> 'entries') as e 
      where e ->> 'name' like '%Doe%'); 

兩種說法之間的區別是,第一查詢將只有你向你展示匹配的數組元素。如果至少有一個匹配項,第二個將顯示全部文檔的數組元素。

+0

這似乎工作。我想我可以用某種方式處理可能的重複。 – fiskeben

+0

這些不重複。這些是你數組中的多個值。但是您可以使用'exists'查詢來從基表中獲取唯一的唯一行。 –

相關問題