使用row_to_json创建JSON时将名称设置为属性


24

仅对某些列f1, f2, f3...使用row_to_json函数时,是否可以重命名默认名称?

我可以

row_to_json(customers)

返回

{"id_customer":2,"first_name":"bla","last_name":"second_bla"}

但是,如果我只想要没有的名称id_customer,则必须使用

row_to_json(row(first_name, last_name))

然后我得到

{"f1":"bla","f2":"second_bla"}

我想使用默认列名或我自己的列名来获得此结果。我知道我可以创建自己的复合类型并使用

row_to_json(row(first_name, last_name))::my_custom_type

但是在不创建该类型的情况下在查询中是否可以正确执行呢?


1
另外,请参阅:参考1参考2,以了解类似内容
MikeM,2014年

Answers:


17

公用表表达式使您不仅可以为CTE,而且为其列明确指定别名。

WITH data(col1,col2,cola,colb) AS (
  VALUES (1,2,'fred','bob')
)
SELECT row_to_json(data) FROM data;

这与@dezso的示例不同,因为它不col AS alias用于SELECT列表中的每个列。它为CTE表别名中的列名加上别名。

我已经使用VALUES表达式作为子查询,但是您可以使用SELECT任何喜欢的表达式;关键是,通过指定列名列表,可以在CTE定义中覆盖子查询中提供或假定的任何列别名。

您可以再次在子查询中执行相同的操作,而不是使用AS alias

SELECT row_to_json(data) 
FROM (VALUES (1,2,'fred','bob')) data(col1,col2,cola,colb);

这不适用于ROW表达式。您只能将a ROW转换为具体类型,不能对其进行别名。

regress=> SELECT ROW(1,2,'fred','bob') AS x(a,b,c,d);
ERROR:  syntax error at or near "("
LINE 1: SELECT ROW(1,2,'fred','bob') AS x(a,b,c,d);

我们的解决方案(使用,性能等)之间是否有任何区别(除了样式和/或可读性之外)?
dezso 2012年

@dezso不,我可能应该发表评论。抱歉。
Craig Ringer 2012年

我认为可以。我什至赞成您的答案b / c,其中包含有用的信息,而我的却没有。
dezso 2012年

是否存在用于动态获取列别名的语法?我从一个EAV(实体属性值)模式中提取,在该模式中,还从attribute.name列中选择了所需的键名。
克里斯(Chris)

@Chris您将需要9.4中更复杂的json函数。
Craig Ringer 2015年

23
select 
   c.id,
   (select row_to_json(_) from (select c.first_name, c.last_name) as _) as first_last,
   c.age
from
   customers as c

将在不影响性能的前提下做您想要的事情(并且不会太冗长):

  id  |   first_last                                |   age
------+---------------------------------------------+---------
  1   | {"fisrt_name": "John", "last_name": "Smit"} |   34

4
这个答案是一颗宝石。
蒂芬(Tiffon)

非常感谢您节省了我的下午时间,很可惜,这不是PostgreSQL API中引用的示例。我知道这是可能的
jlandercy

9

您可以执行以下操作:

WITH r AS (
  SELECT 'bla' AS name1, 'otherbla' AS name2
)
SELECT row_to_json(r.*)
FROM r
;

(当然,使用

SELECT row_to_json(r.*)
FROM (SELECT 'bla' AS name1, 'otherbla' AS name2) r
;

但我发现前者更具可读性。)

在该WITH部分中,您可以动态构建任何结构的行。


将非jsonb与jsonb连接起来::: SELECT row_to_json(r。*)FROM(SELECT c1,c2 :: jsonb FROM us_ca_monterey_aoc.test)as r
Andrew Scott Evans

9

您可以使用json_build_object

SELECT 
  json_build_object('id', data.customer_id, 'first_name', data.first_name, 'last_name', data.last_name) as your_json
FROM data;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.