带有json输出的Postgresql视图

带有json输出的Postgresql视图,json,postgresql,Json,Postgresql,我想建立一个postgres视图,它将结果输出为json 视图应查询名为“事件”的表: CREATE OR REPLACE VIEW jsonview AS SELECT array_to_json(array_agg(t)) as events_as_json FROM (SELECT * FROM events)t 并以json格式给出结果。这是可行的,但我现在想用如下方式指定视图的输出: SELECT * FROM jsonview WHERE events.year_begin =

我想建立一个postgres视图,它将结果输出为json

视图应查询名为“事件”的表:

CREATE OR REPLACE VIEW jsonview AS 
SELECT array_to_json(array_agg(t)) as events_as_json
FROM (SELECT * FROM events)t
并以json格式给出结果。这是可行的,但我现在想用如下方式指定视图的输出:

SELECT * FROM jsonview
WHERE events.year_begin = 1552;
但这会由于不存在条目而产生错误。 有什么建议吗?

我想你想要一套

create or replace view jsonview as 
select row_to_json(t) as events_as_json
from events t
如果要按值进行搜索,则最好保留该列

create or replace view jsonview as 
select
    row_to_json(t) as events_as_json,
    year_begin
from events t
但是JSON视图的意义是什么?它在各方面都很糟糕


如果您想要一个对象数组,那么最好不要创建一个视图并将其作为查询

select json_agg(row_to_json(t)) as events_as_json
from events t
where year_begin = 1552
但是,如果您真的想以非常糟糕的方式执行此操作,并从视图中过滤对象数组,那么请将视图创建为:

create or replace view jsonview as
select json_agg(row_to_json(t)) as events_as_json
from events t
并对数组进行过滤

select json_agg(obj) as events_as_json
from (
    select json_array_elements(events_as_json) as obj
    from jsonview
) j 
where (obj ->> 'year_begin')::integer = 1552

改为创建表值函数:

CREATE FUNCTION events_json()
RETURNS SETOF json
AS
$$
        SELECT  ARRAY_TO_JSON(ARRAY_AGG(T))
        FROM    events t
$$
LANGUAGE 'sql';

CREATE FUNCTION events_json(year INT)
RETURNS SETOF json
AS
$$
        SELECT  ARRAY_TO_JSON(ARRAY_AGG(T))
        FROM    events t
        WHERE   year_begin = $1;
$$
LANGUAGE 'sql';

你确定你想把所有的都排在一行吗?是的,这就是我的目的。我希望结果是一个嵌套的json。json视图的优点是避免在我的框架控制器(API)中使用json编码。让Postgres创建JSON可能是一种速度优化(见:)@kOssi根据评论编辑