Postgres function returning a row as JSON value
我是PG的新手,并尝试从MSSQL转换。
我正在开发一个将返回JSON结果的函数。
这个工作:
1 2 3 4 5 6 | CREATE OR REPLACE FUNCTION ExampleTable_SelectList() RETURNS JSON AS $$ SELECT array_to_json(array_agg(row_to_json(t))) FROM (SELECT id, value1, value2, FROM ExampleTable) t $$ LANGUAGE SQL; |
现在,我想调用可以更新的返回值并将该值转换为JSON以返回。 因此,这个给出了
1 2 3 4 5 6 7 8 9 10 11 | CREATE OR REPLACE FUNCTION ExampleTable_Update (id BIGINT, value1 text) RETURNS JSON AS $$ SELECT row_to_json(t) FROM ( UPDATE ExampleTable SET Value1 = value1 WHERE id= id Returning Value1, Value2; ) t $$ LANGUAGE SQL; |
我怀疑Postgres不允许
我看到两个主要问题:
1.根本不能将
2.您有潜在的危险命名冲突,尚未解决。
更好的查询/功能
暂时搁置SQL函数包装器(我们将再回过头来)。您可以使用带有
1 2 3 4 | UPDATE tbl SET value1 = 'something_new' WHERE id = 123 RETURNING row_to_json(ROW(value1, value2)); |
剩下的问题:行构造函数
1 2 | row_to_json {"f1":"something_new","f2":"what ever is in value2"} |
在Postgres 9.3中,你需要一个CTE另一个函数来封装第一步或者转换为明确定义的行类型。细节:
- 在SQL中返回JSON对象数组(Postgres)
在Postgres 9.4中,只需使用
1 2 3 4 | UPDATE tbl SET value1 = 'something_new' WHERE id = 123 RETURNING json_build_object('value1', value1, 'value2', value2); |
要么:
1 2 | ... RETURNING json_object('{value1, value2}', ARRAY[value1, value2]); |
现在,您将获得原始列名称或您选择的任何键名称:
1 2 | row_to_json {"value1":"something_new","value2":"what ever is in value2"} |
将它包装在一个函数中很容易,这将我们带到你的第二个问题......
命名冲突
在原始函数中,您对函数参数和列名称使用相同的名称。这通常是一个非常糟糕的主意。您需要密切了解哪个标识符首先出现在哪个范围内。
在手头的情况下,结果完全是胡说八道:
1 2 3 4 5 6 7 8 | CREATE OR REPLACE FUNCTION ExampleTable_Update (id BIGINT, value1 text) RETURNS ... UPDATE ExampleTable SET Value1 = value1 WHERE id = id Returning Value1, Value2; ... $$ LANGUAGE SQL; |
虽然您似乎期望
更糟糕的是,您可能直到稍后才意识到这一点,因为SQL函数将返回由函数的
在这种特殊情况下,你会得到"幸运",因为你还有
所以,不要。
避免这样的潜在命名冲突,除非你确切知道你在做什么(显然不是这种情况)。我喜欢的一个约定是在函数中为参数和变量名前置下划线,而列名永远不会以下划线开头。在许多情况下,您可以使用位置引用来明确:
1 2 3 4 5 6 7 8 | CREATE OR REPLACE FUNCTION foo (_id BIGINT, _value1 text) RETURNS json AS $func$ UPDATE tbl SET value1 = _value1 WHERE id = _id RETURNING json_build_object('value1', value1, 'value2', value2); $func$ LANGUAGE SQL; |
另请注意,这将返回
您需要将
1 2 3 4 5 6 7 8 9 | CREATE OR REPLACE FUNCTION ExampleTable_Update (id BIGINT, value1 text) RETURNS json AS $$ WITH t(Value2) AS ( UPDATE ExampleTable SET Value1 = $2 WHERE id = $1 RETURNING Value2) SELECT row_to_json($2, Value2) FROM t; $$ LANGUAGE SQL; |
请注意,我使用位置参数