Не удается обновить элемент массива first

#json #sql-update #postgresql-9.5

#json #sql-обновление #postgresql-9.5

Вопрос:

тип столбца = jsonb

 {
  "article": "1215",
  "availability": [
    {
      "currency": "usd",
      "discount": {
        "due_date": null,
        "is_active": false,
        "old_price": 3599
      },
      "is_available": true,
      "qty": 0,
  

Мне нужно обновить is_available = false (в элементе первого массива), потому что кол-во = 0.

Я пытаюсь это:

 UPDATE product_imp
SET data = jsonb_set(data, '{availability, 0, is_available}', 'false', false)
where product_imp.data ->> '{availability, 0, qty}'::numeric = 0
  

Но я получаю сообщение об ошибке:

 ERROR:  invalid input syntax for type numeric: "{availability, 0, qty}"
LINE 3: where product_imp.data ->> '{availability, 0, qty}'::numeric...
                                   ^
SQL state: 22P02
Character: 125
  

Комментарии:

1. Пожалуйста, добавьте язык, используемый для тегов вопроса (путем редактирования)). Спасибо.

Ответ №1:

В вашем коде две ошибки: оператор приведения :: привязывается сильнее, чем ->> оператор, поэтому Postgres пытается преобразовать '{availability, 0, qty}' в числовое значение.

Вторая ошибка заключается в том, что вы не можете использовать ->> для получения значения на основе пути, вам нужно использовать #>>

 UPDATE product_imp
  SET data = jsonb_set(data, '{availability, 0, is_available}', 'false', false)
where (product_imp.data #>> '{availability, 0, qty}')::numeric = 0
  

Комментарии:

1. Я использую это: «где (product_imp.data -> ‘доступность’-> 0->>’кол-во’)::int = 0» . И все работает нормально