Postgres - jsonb: обновить ключ в столбце со значением, взятым из другой таблицы - PullRequest
0 голосов
/ 08 января 2020

Я использую postgres 9.5. У меня есть таблица профиля, в которой перечислены имена:

public.profiles:
      id |   first_name      |        last_name
      --- ---------------  ---------------------
       1        Jason                   Bourne
       2       Jhonny                    Quest

У меня есть таблица счетов-фактур:

  public.invoices:
            invoice_id      |         billing_address       |    profile_id
         ------------------   -----------------------------  ---------------------
                   1          {                                        2
                               "address_line1": "445 Mount 
                                     Eden Road", 
                               "city":"Mount Eden", 
                               "country": "Auckland"
                              }

Я хочу обновить столбец billing_address таблицы счетов-фактур, указав first_name и last_name из таблицы профиля, например:

 public.invoices:
                invoice_id      |         billing_address       |    profile_id
             ------------------   -----------------------------  ---------------------
                       1          {
                                   "name" : "Jhonny Quest"                2
                                   "address_line1": "445 Mount 
                                         Eden Road", 
                                   "city":"Mount Eden", 
                                   "country": "Auckland"
                                  }

. Для этого я попытался использовать jsonb_set:

UPDATE invoices AS i SET billing_address = jsonb_set(billing_address,'{name}', SELECT t::jsonb FROM (SELECT CONCAT (p.first_name,p.middle_name, p.last_name) FROM profiles p WHERE p.id = i.profile_id)t )

. Выдает ошибку при SELECT. Т.Б. Я даже не уверен, является ли какое-либо из этих утверждений законным. Нужны любые указания.

1 Ответ

1 голос
/ 08 января 2020

Нажмите: demo: db <> fiddle

UPDATE invoices i
SET billing_address = s.new_billing_address
FROM (
    SELECT
        i.invoice_id,
        jsonb_set(
            billing_address, 
            '{name}'::text[], 
            to_jsonb(concat_ws(' ', first_name, last_name))
        ) AS new_billing_address
    FROM 
        invoices i
    JOIN profiles p ON i.profile_id = p.id
) s
WHERE s.invoice_id = i.invoice_id;

Создание SELECT с присоединением ко второй таблице; После этого вы можете создать новый объект JSON из частей имени, используя to_jsonb() и оператор concat || (или, конечно, concat_ws (), как указано в комментариях).

...