Преобразование значения в столбце (тип данных массива) на основе значения списка массивов в запросе PostgreSQL - PullRequest
0 голосов
/ 07 августа 2020

Мне нужна ваша помощь по Postgresql logi запросов c

Скажем, у меня есть таблица

Информация о среде: AWS Aurora Postgresql db 10.6.x

CREATE TABLE test_table
(id               character varying(50)
name              character varying(128) 
original_value    ARRAY
);

Таблица со значениями

 id                   name             original_value
O1S000000000301       Screw            {metal_fabtication_c,cabinetery_andor_shelves_c,table_c}
O1S000000000302       wrench           {carpentry_c,handyman_c}
O1S000000000303       impact_driver    {carpentry_c,masonry_c,handyman_c}

Transformed_value не является таблицей, но у нее есть имя и соответствующее преобразование, как показано ниже

Name                        Value
metal_fabrication_c         Metal Fabrication
cabinetry_andor_shelves_c   Cabinetry/Shelving
handyman_c                  Handyman
carpentry_c                 Carpentry
masonry_c                   Masonry
table_c                     Furniture

У меня есть Написать запрос, в котором Original_value должно получить это эквивалентное transformed_Value.

SELECT id, name, original_value as transformed_value 
 FROM test_table 
WHERE id IN('O1S000000000301','O1S000000000302','O1S000000000303')

Результат должен быть следующим

id                    name             transformed_value
O1S000000000301       Screw            Metal Fabrication,Cabinetry/Shelving,Furniture
O1S000000000302       wrench           Carpentry,Handyman
O1S000000000303       impact_driver    Carpentry,Masonry,Handyman

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

Вы можете использовать предложение WITH для этого сценария

попробуйте следующим образом:

with cte(name, value) as (
values
('metal_fabtication_c', 'Metal Fabrication'),
('cabinetery_andor_shelves_c', 'Cabinetry/Shelving'),
('handyman_c', 'Handyman'),
('carpentry_c', 'Carpentry'),
('masonry_c', 'Masonry'),
('table_c', 'Furniture')
),

cte1 as 
(
select id, name, unnest(original_value) as "original_value" from test_table where id in ('O1S000000000301','O1S000000000302','O1S000000000303')
)

select 
t1.id,
t1.name, 
array_agg(t2.value) as "transformed_value"
from cte1 t1 left join cte t2 on t2.name=t1.original_value
group by 1,2

Выше возвращается преобразованное значение в ARRAY. если вам нужны значения, разделенные запятыми, используйте string_agg(t2.value,',') вместо array_agg(t2.value)

Также, если вам нужна новая преобразованная пара значений ключа, вы можете сначала добавить WITH Block

ДЕМО

1 голос
/ 07 августа 2020

Я принимаю эти вторые данные «Transformed_value» как таблицу и исправляю некоторые ошибки, которые я считаю опечаткой (metal_fabrication_c / metal_fabtication_ c).

Можно разбить массив с помощью unnest (anyarray) и ссылаться на данные с помощью таблицы преобразованных значений, а затем снова агрегировать данные с помощью string_agg (выражение, разделитель) , таким образом, придя к тому, что я считаю ваша потребность.

with reference as (
select 
    tt.id,tt.name,unnest(tt.original_value) as original 
from test_table tt
)
select 
    r.id,
    r.name,
    string_agg(r.original,',') as original,
    string_agg(tv.value,',') as transformed 
from reference r
left join transformed_value tv on tv.name = r.original
group by r.id,r.name

enter image description here

Complete code you can check here: DBFiddle

0 голосов
/ 07 августа 2020

Кажется, вы просто хотите заменить _ подчеркнутым, сделать каждое первое слово прописным и удалить завершающее _c. Если это правда (и fabtication - тип), вы можете использовать комбинацию replace, regexp_replace and initcap () `

select id, name, 
       string_agg(initcap(replace(regexp_replace(ov, '_c$', ''), '_', ' ')), ',' order by x.idx) as value
from test_table t
   cross join unnest (original_value) with ordinality as x(ov,idx)
where id IN ('O1S000000000301','O1S000000000302','O1S000000000303')   
group by id, name;   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...