Получить метки из массива, используя PostgreSQL - PullRequest
0 голосов
/ 04 мая 2020

Моя таблица, как показано ниже -

Таблица 1:

+----+-----------------------------------------------------------------------------------------------------------------------------------------+
| id |                                                              label_value |
+----+-----------------------------------------------------------------------------------------------------------------------------------------+
|  1 | [{"label":"3500 - Application","value":"35060"},{"label":"3450 - Content","value":"34650"},{"label":"3890 - Mobile","value":"38960"}]   |
|  2 | [{"label":"3700 - Application","value":"3500"},{"label":"3950 - Content","value":"3450"},{"label":"3290 - Mobile","value":"3890"}]      |
|  3 | [{"label":"3540 - Application","value":"35400"},{"label":"3480 - Content","value":"34650"},{"label":"39090 - Mobile","value":"38390"}]  |
|  4 | [{"label":"350220 - Application","value":"3500"},{"label":"342250 - Content","value":"3450"},{"label":"38190 - Mobile","value":"3890"}] |
+----+-----------------------------------------------------------------------------------------------------------------------------------------+

Таблица 2:

+-----+----------------+-------+
| id  | table_1_ref_id | value |
+-----+----------------+-------+
|   1 |              1 | 35060 |
|   2 |              1 | 38960 |
|   3 |              1 | 35060 |
|   4 |              3 | 38390 |
|   5 |              2 |  3450 |
|   6 |              4 |  3890 |
+-----+----------------+-------+

У меня есть две таблицы, в которых один столбец хранит данные в виде массива. В этом массиве хранятся значения в виде пары label-value . Итак, мне нужно извлечь метку в зависимости от значения в этой паре.

В другой таблице хранится значение, указанное в массиве (в таблице 2). Теперь я должен найти ассоциированную метку , которая упоминается в таблице 1, в зависимости от значения в таблице 2.

Для приведенной выше таблицы с примерами ожидаемый результат будет следующим: - Ожидаемый результат

3500 - Application
3890 - Mobile
3500 - Application
39090 - Mobile
3950 - Content
38190 - Mobile

Как мне достичь вышеуказанного результата?

1 Ответ

1 голос
/ 05 мая 2020

Вы можете объединить две таблицы, а затем использовать jsonb_array_elements для итерации по значению JSNO и выбрать одну с соответствующим значением:

Очевидно, у вас есть несколько записей в массиве JSON с одинаковыми value, поэтому вам нужно применить ограничение к подвыбору.

select t1.id, 
       (select e ->> 'label'
        from jsonb_array_elements(t1.label_value) as x(e)
        where x.e ->> 'value' = t2.value::text
        limit 1) as label
from t1
  join t2 on t1.id = t2.table_1_ref_id;

Онлайн пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...