gpt4 book ai didi

json - Postgresql - 使用一个表中的选定列作为 json select 语句

转载 作者:行者123 更新时间:2023-11-29 12:52:11 27 4
gpt4 key购买 nike

https://www.db-fiddle.com/f/gZXz9hJRzpiEmDr7V8PXEG/0

PostgreSQL 10.x

考虑下表:

CREATE TABLE attributes (
attr TEXT
);

INSERT INTO attributes VALUES('sth1');
INSERT INTO attributes VALUES('sth2');

CREATE TABLE items (
name TEXT,
custom JSONB
);

INSERT INTO items VALUES ('A', '{"sth1": "Hello"}');
INSERT INTO items VALUES ('B', '{"sth1": "Hello", "sth2": "Okay"}');
INSERT INTO items VALUES ('C', '{"sthNOT": "Hello", "sth2": "Okay"}');

我的目标是仅查询 attributes 表中的列作为 ìtems.custom 列中的 Json 键 - 因此查询始终返回同一组键。

当我知道我会做的专栏时:

SELECT name, custom->>'sth1', custom->>'sth2' FROM items;

我想让这个查询成为“动态的”——这样在attributes 表中可以有任意的键定义。

我也可以接受,在查询中创建一个新的 Json 对象 - 只包含 attributes 表中定义的键和 items.custom< 中的相应值 列。因此,将 attributes 创建的一个 Json 对象与 items.custom 数据合并是一种选择。

有没有办法在 Postgres 中实现这一点?

最佳答案

您需要一个函数来动态格式化和执行合适的查询。该函数返回具有 name 和 jsonb 对象 data 的行:

create or replace function select_from_items()
returns table(name text, data jsonb) language plpgsql as $$
declare
cols text;
begin
select string_agg(format('%1$L, custom->>%1$L', attr), ', ')
from attributes
into cols;

return query execute format('
select name, jsonb_strip_nulls(jsonb_build_object(%s))
from items', cols);
end $$;

select * from select_from_items();

name | data
------+-----------------------------------
A | {"sth1": "Hello"}
B | {"sth1": "Hello", "sth2": "Okay"}
C | {"sth2": "Okay"}
(3 rows)

因此这是您的第二个选择。第一个假设创建一种数据透视表并且需要更复杂的技术,例如参见

关于json - Postgresql - 使用一个表中的选定列作为 json select 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51291585/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com