【问题标题】:Postgres function with jsonb parameters带有 jsonb 参数的 Postgres 函数
【发布时间】: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,请看下一篇文章。
  • 你在说什么帖子?其他问题或其他评论?

标签: database postgresql function stored-procedures pgadmin


【解决方案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 转钥匙,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多