Postgres Функция Json_each_Text () - PullRequest
       6

Postgres Функция Json_each_Text ()

1 голос
/ 04 августа 2020

У меня есть Json столбец 'status' в таблице site_request_info со структурой данных, как указано ниже:

{
   "portStatus":{
      "status":"In Progress",
      "hrefStatus":{
         "155e4d40948647bd947fceb58131982d":"FOC Received",
         "155e4d40948647bd947fceb58131983d":"FOC Received"
      }
   },
   "broadCloudStatus":{
      "status":"Customer Created",
      "orderStatus":{
         "124260smbbTesct1188":"Order Created",
         "124260smbbTesct1188-CPE":"Order Created"
      }
   },
   "provisioningStatus":"Completed"
}

Мое требование - фильтровать данные на основе HrefStatus, для этого я написал запрос, например :

select  * 
from product_requests p 
  inner join billing_Account b on p.account_id= b.account_id 
  inner join network_id n on b.account_id= n.account_id 
  inner join site_request_info s on n.networkid_uuid=s.networkid_uuid and s.product_request_id=p.request_id 
  **inner join json_each_text(cast(s.status->'portStatus'->'hrefStatus' as json)) d on true**
where  p.request_status='In Progress' and d.value IN ('FOC Received'); 

из-за использования функции json_each_text () я получаю две строки с одинаковыми данными, которые я не хочу, чтобы мой запрос возвращал. моя цель - выбрать все те строки, у которых hrefStatus предоставлен предложением IN

Я пробовал один альтернативный запрос, но я не могу использовать класс In с этим решением

cast(status->'portStatus'->'hrefStatus' as json)::text like '%FOC Received%'

1 Ответ

0 голосов
/ 04 августа 2020

Вы можете переместить свое условие в условие EXISTS:

select  * 
from product_requests p 
  join billing_Account b on p.account_id = b.account_id 
  join network_id n on b.account_id = n.account_id 
  join site_request_info s on n.networkid_uuid = s.networkid_uuid and s.product_request_id = p.request_id 
where p.request_status = 'In Progress' 
  and exists (select *
              from jsonb_each_text(s.status::jsonb->'portStatus'->'hrefStatus') as x(key,value)
              where x.value = 'FOC Received')

С Postgres 12 вы также можете использовать выражение JSON path:

and s.status::jsonb @? '$.portStatus.hrefStatus.* ? (@ == "FOC Received")'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...