Выберите из столбца JSON Array postgresql JSON - PullRequest
1 голос
/ 03 мая 2020

У меня есть следующее JSON, сохраненное в столбце PostgreSQL JSON

{
  "status": "Success",
  "message": "",
  "data": {
    "serverIp": "XXXX",
    "ruleId": 32321,
    "results": [
      {
        "versionId": 555555,
        "PriceID": "8abf35ec-3e0e-466b-a4e5-2af568e90eec",
        "price": 550,
        "Convert": 0.8922953080331764,
        "Cost": 10
      }
    ]
  }
}

Я хотел бы найти конкретный c priceID по всему столбцу JSON (имя info) и выберите весь элемент результатов по PriceID. Как мне это сделать в postgresql JSON?

1 Ответ

2 голосов
/ 03 мая 2020

Одна опция использует exists и json(b)_array_elements(). Если предположить, что ваша таблица называется mytable, а столбец jsonb равен mycol, это будет выглядеть следующим образом:

select t.*
from mytable t
where exists (
    select 1
    from jsonb_array_elements(t.mycol -> 'data' -> 'results') x(elt)
    where x.elt ->> 'PriceID' = '8abf35ec-3e0e-466b-a4e5-2af568e90eec'
)

В подзапросе jsonb_array_elements() отсоедините массив json, расположенный в заданном дорожка. Затем предложение where гарантирует, что хотя бы один элемент в массиве имеет заданный PriceID.

Если ваши данные имеют тип данных json, а не jsonb, вам нужно использовать json_array_elements() вместо jsonb_array_elements().


Если вы хотите отобразить некоторую информацию исходя из соответствующего элемента массива, то он другой. Вы можете использовать lateral join вместо exists. Имейте в виду, однако, что это будет дублировать строки, если более одного элемента массива совпадают:

select t.*, x.elt ->> 'price' price
from mytable t
cross join lateral jsonb_array_elements(t.mycol -> 'data' -> 'results') x(elt)
where x.elt ->> 'PriceID' = '8abf35ec-3e0e-466b-a4e5-2af568e90eec'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...