JSONB Представляет значение ключа jsonb как массив - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть поле extra с типом jsonb в моей таблице product. И мне нужно получить ключ uniq со значениями uniq для каждого ключа из всех строк продуктов. Пример данных в дополнительном поле

{"SIZE": "110/116", "COLOUR": "Vit", "GENDER": "female", "AGE_GROUP": "Kids", "ALTERNATIVE_IMAGE": "some_path"}

сейчас я использую запрос, подобный этому

        select DISTINCT e.key, array_agg(DISTINCT e.value) as fields 
        from products AS p 
        join jsonb_each_text(p.extras) e on true        
        GROUP BY e.key

Объявление имеет respnse (небольшая часть с некоторыми ключами в полном ответе, все ключи присутствуют), как это

[
  {
    "key": "AGE_GROUP",
    "fields": "{Adult,children,Kids}"
  },
  {
    "key": "GENDER",
    "fields": "{female,male,man}"
  }
]

как изменить его на массив для полей псевдонимов?

вот так

[
  {
    "AGE_GROUP": ["Adult","children","Kids"]
  },
  {
    "GENDER": ["female","male","man"]
  }
]

или, может быть, так здорово

[
"some_alias": [{"AGE_GROUP": "Adult", "AGE_GROUP": "children", "AGE_GROUP": "Kids"}],
"some_alias": [{"GENDER": "female", "GENDER": "male", "GENDER": "man"}]
]

1 Ответ

0 голосов
/ 10 апреля 2020

Это даст вам прежнюю форму, я думаю:

select jsonb_agg(jsonb_build_object(k,v)) from (
        select DISTINCT e.key, jsonb_agg(DISTINCT e.value) as fields 
        from products AS p 
        join jsonb_each_text(p.extras) e on true        
        GROUP BY e.key
) b(k,v);

С уважением,
Bjarni

...