2015-12-03 4 views
2

Скажем, у меня есть две таблицы:Регистрация результат возвращающих набор функций (json_array_elements) с колонкой таблицы

User_Combination

+--------+----------------+ 
| id | combination | 
+--------+----------------+ 
| 6 |  [1, 2]  | 
| 9 |  [2, 3]  | 
+--------+----------------+ 

цвета

+--------+----------------+ 
| id | color  | 
+--------+----------------+ 
| 1 |  Blue  | 
| 2 |  Yellow | 
| 3 |  Green | 
+--------+----------------+ 

Я пытаюсь присоединиться к результат json_array_elements(color) с элементами id. Например, результат

select json_array_elements(color) as CombinationID 
from User_Combination where id = 6; 

является

+-------------------+ 
| CombinationID | 
+-------------------+ 
| 1    | 
| 2    | 
+-------------------+ 

Я не могу присоединиться к CombinationID с Colors.id. Когда я пытаюсь команду SQL, такие как:

select json_array_elements(article_data) AS articlesInOutfits (color) as CombinationID 
from User_Combination uc JOIN Colors co ON co.id = articlesInOutfits; 

или

select json_array_elements(article_data) AS articlesInOutfits (color) as CombinationID 
from User_Combination uc JOIN Colors co ON co.id = uc.articlesInOutfits; 

Это говорит articlesInOutfits не существует.
Любые советы?

+1

вашу версию Postgres? –

+0

Использование 9.3.3. Удивительно, что не работает. – NateW

+0

Можете ли вы исправить некоторые непонятные ошибки в своем вопросе? 'json_array_elements (color)'? И что такое «Элементы»? Фактические определения таблиц, показывающие типы данных и ограничения, были бы гораздо более полезными. –

ответ

3

Использование unnest() получить распакованы комбинации:

select id, unnest(combination) cid 
from user_combination; 

id | cid 
----+----- 
    6 | 1 
    6 | 2 
    9 | 2 
    9 | 3 
(4 rows)  

Использование распакованыcids присоединиться colors:

select u.id, color 
from (
    select id, unnest(combination) cid 
    from user_combination 
    ) u 
join colors c 
on cid = c.id; 

id | color 
----+-------- 
    6 | Blue 
    6 | Yellow 
    9 | Yellow 
    9 | Green 
(4 rows) 

использовать агрегатную функцию (например, json_agg()), чтобы получить соединенные цвета агрегированных для пользователя:

select u.id, json_agg(color) 
from (
    select id, unnest(combination) cid 
    from user_combination 
    ) u 
join colors c 
on cid = c.id 
group by 1; 

id |  json_agg  
----+--------------------- 
    9 | ["Yellow", "Green"] 
    6 | ["Blue", "Yellow"] 
(2 rows)  

Если combination имеет тип json вы должны использовать json_array_elements() в боковой присоединиться:

select u.id, json_agg(color) 
from (
    select id, cid 
    from user_combination, 
    lateral json_array_elements(combination) cid 
    ) u 
join colors c 
on cid::text::int = c.id 
group by 1; 
+0

awesome, 1 сек, и я попробую это – NateW

+0

Я использую Postgres версии 9.3.3, и он говорит: ERROR: function unnest (json) не существует – NateW

+0

Ahh Я вижу, я храню массив как тип JSON. Я исправлю это, а затем попробую unsest – NateW