2017-01-29 5 views
0

У меня есть следующий JSON, хранящийся в столбце типа jsonb. Я хочу запросить второй элемент внешнего массива и фильтровать все строки, которые имеют значение в столбце 'cid' как 'CID1'.Фильтрация столбца PostgreSQL JSONB не работает

{"root":[[ 
      {"cid":"CID1","Display":"User One","FName":"User","LName":"One"}, 
      {"cid":"CID1","Display":"User Two","FName":"User","LName":"Two"}, 
      {"cid":"CID1","Display":"User Three","FName":"User","LName":"Three"}, 
      {"cid":"CID2","Display":"User One","FName":"User","LName":"One"}, 
      {"cid":"CID2","Display":"User Two","FName":"User","LName":"Two"}, 
      {"cid":"CID2","Display":"User Three","FName":"User","LName":"Three"}  

      ], 
      [ 
      {"cid":"CID1","Display":"User One","FName":"Userfff","LName":"One"}, 
      {"cid":"CID1","Display":"User Two","FName":"User","LName":"Two"}, 
      {"cid":"CID1","Display":"User Three","FName":"User","LName":"Three"}, 
      {"cid":"CID2","Display":"User One","FName":"User","LName":"One"}, 
      {"cid":"CID2","Display":"User Two","FName":"User","LName":"Two"}, 
      {"cid":"CID2","Display":"User Three","FName":"User","LName":"Three"}  
      ]]} 

Я написал следующий запрос, и был успешным в получении всех строк из второго массива в качестве объектов JSON, однако, когда я пытаюсь фильтровать их я получаю ошибку

42703: колонка " filterin»не существует

select jsonb_array_elements((ARRAY(select jsonb_array_elements(msg->'root') ele))[2]::jsonb) filterin 
from js 
where filterin->>'cid'='CID1'; 

что я должен исправить в следующем запросе, так что я могу фильтровать по столбцам?

+0

Работал отлично, спасибо @Sami – puneet

+0

@Sami, как вы думаете, поставив индекс GIN на колонке jsonb будет лучше? – puneet

ответ

1

Выходные псевдонимы не могут использоваться в части WHERE. У вас есть два варианта: подзапрос или дублирование определения.

select jsonb_array_elements((ARRAY(select jsonb_array_elements(msg->'root') ele))[2]::jsonb) filterin 
from js 
where jsonb_array_elements((ARRAY(select jsonb_array_elements(msg->'root') ele))[2]::jsonb)->>'cid'='CID1'; 

или

SELECT filterin FROM 
(select jsonb_array_elements((ARRAY(select jsonb_array_elements(msg->'root') ele))[2]::jsonb) filterin 
from js) data 
WHERE filterin->>'cid'='CID1'; 
Смежные вопросы