带有 jsonb 参数的 Postgres 函数

Posted

技术标签:

【中文标题】带有 jsonb 参数的 Postgres 函数【英文标题】:Postgres function with jsonb parameters 【发布时间】:2016-03-02 17:57:14 【问题描述】:

我在这里看到过类似的帖子,但我的情况与我目前发现的情况略有不同。我正在尝试使用参数调用 postgres 函数,因为它们与 jsonb 查询有关,所以我可以在函数逻辑中利用这些参数。这是我尝试使用参数重新创建的查询示例。

SELECT * 
  from edit_data 
  where ( "json_field"#>'Attributes' )::jsonb @> 
                    '"issue_description":"**my description**",  
                      "reporter_email":"**user@generic.com**"'::jsonb

我可以在 PGAdmin 中很好地运行此查询,但到目前为止,我所有尝试在带有“my description”和“user@generic.com”值参数的函数内运行它的尝试都失败了。这是我正在尝试创建的函数的一个简单示例:

CREATE OR REPLACE FUNCTION get_Features(
    p1 character varying,
    p2 character varying)
  RETURNS SETOF edit_metadata AS
$BODY$ 
SELECT * from edit_metadata where ("geo_json"#>'Attributes' )::jsonb @> '"issue_description":**$p1**, "reporter_email":**$p2**'::jsonb;
$BODY$
  LANGUAGE sql VOLATILE
  COST 100
  ROWS 1000;

我知道语法不正确,我为此苦苦挣扎了一两天。谁能帮我理解如何最好地处理这些值周围的双引号并在此处利用参数?

TIA

【问题讨论】:

它是一个字符串,只要像'"issue_description":"'||yourParam||'"这样连接它。 我也尝试了一些类似的方法: CREATE OR REPLACE FUNCTION get_customentitywithserializeddatatest7( p1 字符变化,p2 字符变化) RETURNS SETOF edit_metadata AS $BODY$ SELECT * from edit_metadata where ( "geo_json"#>' 属性')::jsonb @> '"issue_description":COALESCE($1, issue_description), "reporter_email":COALESCE($2, report_email)'::jsonb; $BODY$ LANGUAGE sql VOLATILE COST 100 ROWS 1000; 你还是不明白,这个'"issue_description":"**my description**", "reporter_email":"**user@generic.com**"'是一个字符串,所以你不能在里面使用函数、命令或变量,希望postgresql能理解,它不是php,你必须对它说你正在形成一个新的字符串。它应该像(对于你的情况):'"issue_description":"'||p1||'", "reporter_email":"'||p2||'"' 这样你就告诉 postgresql 你想在你的字符串中“注入”你的参数 嗨,Jorge,请看下一篇文章。 你在说什么帖子?其他问题或其他评论? 【参考方案1】:

你可以使用函数json_build_object:

select json_build_object(
    'issue_description', '**my description**',
    'reporter_email', '**user@generic.com**');

你会得到:

                                    json_build_object                                    
-----------------------------------------------------------------------------------------
 "issue_description" : "**my description**", "reporter_email" : "**user@generic.com**"
(1 row)

这样你就不会输入无效的语法(没有引用字符串的麻烦),你可以用参数交换值。

【讨论】:

感谢您的回复 hruske,我正在研究这个问题,但由于我对 Postgres 和 jsonb 非常陌生,因此我仍然不清楚如何在当前场景中实现它。 json_build_object 转钥匙,非常感谢!

以上是关于带有 jsonb 参数的 Postgres 函数的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 检查空 JSONB 字段

ValueError:无法引用参数值 <django.contrib.postgres.fields.jsonb.JsonAdapter

Postgres:在递归合并函数中删除 jsonb 键

如何从 postgres JSONB 列中获取值?

Postgres Jsonb 聚合

在 Postgres 的 jsonb_array_elements_text 函数中使用 SELECT 子查询