Postgres函数与jsonb参数

问题描述:

我在这里看到了一个类似的帖子,但我的情况与我迄今发现的任何东西都略有不同。我想用参数调用postgres函数,我可以在函数逻辑中利用它们,因为它们与jsonb查询有关。这里是我试图用参数重新创建的查询的一个例子。Postgres函数与jsonb参数

SELECT * 
    from edit_data 
    where ("json_field"#>'{Attributes}')::jsonb @> 
        '{"issue_description":"**my description**", 
         "reporter_email":"**[email protected]**"}'::jsonb 

我可以运行此查询只是pgAdmin的很好,但我所有的努力迄今给函数内部设置有用于“我的描述”和“[email protected]”的价值观已经失败参数运行此。下面是我尝试创建功能的一个简单的例子:

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

+1

它是一个字符串,就像“{”issue_description“:”'|| yourParam ||'“'等等。 –

+0

我也曾尝试沿着这些路线的东西: CREATE OR REPLACE FUNCTION get_customentitywithserializeddatatest7( P1字符改变, P2字符改变) RETURNS SETOF edit_metadata AS $ BODY $ SELECT * FROM edit_metadata其中( “geo_json” #>'{属性}'):: jsonb @>'{“issue_description”:COALESCE($ 1,issue_description),“reporter_email”:COALESCE($ 2,reporter_email)}':: jsonb; $ BODY $ 语言sql VOLATILE COST 100 ROWS 1000; – DenverDevGuy

+1

你还是不明白,这个''{issue_description“:”**我的描述**“,”reporter_email“:”** [email protected] **“}”'是一个字符串,因此你不能在里面使用funcion,命令或变量,并希望postgresql能理解,它不是PHP,你必须说它正在形成一个新的字符串。它应该是(为你的情况):''{“issue_description”:“'|| p1 ||'”,“reporter_email”:“'|| p2 ||'”}''这样你告诉postgresql你想“注入”你的参数在你的弦内 –

你可以使用函数json_build_object

select json_build_object(
    'issue_description', '**my description**', 
    'reporter_email', '**[email protected]**'); 

,你会得到:

        json_build_object          
----------------------------------------------------------------------------------------- 
{"issue_description" : "**my description**", "reporter_email" : "**[email protected]**"} 
(1 row) 

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

+0

感谢您的回复hruske,我正在研究这个问题,但仍然不清楚如何使用我目前的方案来实现它,因为我对Postgres和jsonb特别新。 – DenverDevGuy

+0

json_build_object转了钥匙,非常感谢你! – DenverDevGuy