postgres从函数返回json

Man*_*ngh 4 sql postgresql json function

我知道我可以使用row_to_json来返回json输出

例如,如果我的查询是:

select * from sample;
Run Code Online (Sandbox Code Playgroud)

我可以按如下方式重写它以返回json输出:

select row_to_json(sample) from sample;
Run Code Online (Sandbox Code Playgroud)

但我想要实现的一件事是功能中的相同功能.

举个例子,这里是函数返回表:

CREATE FUNCTION find_val(val text) 
RETURNS SETOF sample AS
$$
BEGIN
RETURN QUERY
SELECT * FROM sample where $1 = ANY(col4);
END;
$$
LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

现在我想从函数返回JSON输出而不是行.我怎样才能做到这一点 ?

这是我到目前为止所尝试的:

native=> CREATE FUNCTION find_val(val text) 
RETURNS SETOF sample AS
$$
BEGIN
RETURN QUERY
SELECT row_to_json(sample) FROM sample where $1 = ANY(col4) ; 
END;
$$
LANGUAGE 'plpgsql';
CREATE FUNCTION
native=> select find_val('yo');
ERROR:  structure of query does not match function result type
DETAIL:  Returned type json does not match expected type integer in column 1.
CONTEXT:  PL/pgSQL function find_val(text) line 3 at RETURN QUERY
native=> drop function find_val(text);
DROP FUNCTION



native=> CREATE FUNCTION find_val(val text) 
native-> RETURNS json AS
native-> $$
native$> BEGIN
native$> SELECT row_to_json(sample) FROM sample where $1 = ANY(col4);
native$> END;
native$> $$
native-> LANGUAGE 'plpgsql';
CREATE FUNCTION
native=> select find_val('yo');
ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function find_val(text) line 3 at SQL statement
native=> 
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 11

这与json vs其他返回类型无关.不能使用普通SELECT的PL/pgSQL函数,它必须是SELECT INTO,RETURN QUERY SELECTPERFORM.根据HINT错误.

在您的情况下,您只需要一个简单的SQL函数.

CREATE FUNCTION find_val(val text) 
RETURNS json AS
$$
SELECT row_to_json(sample) FROM sample where $1 = ANY(col4);
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢克雷格......这很有效.我需要在我的实际函数中执行一些操作,所以只使用了plpgsql.从官方文档中找到正确的方法`CREATE OR REPLACE FUNCTION find_val(val text)RETURNS json AS $$ DECLARE t_row sample%ROWTYPE; BEGIN SELECT*INTO t_row FROM sample其中$ 1 = ANY(col4); RETURN row_to_json(t_row); 结束; $$ LANGUAGE'plpgsql';` (4认同)