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

boo*_*biq 32 postgresql

仅对某些列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

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

小智 34

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
Run Code Online (Sandbox Code Playgroud)

会做你想做的事情而不会对性能产生任何影响(而且不会太冗长):

  id  |   first_last                                |   age
------+---------------------------------------------+---------
  1   | {"fisrt_name": "John", "last_name": "Smit"} |   34
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是一个宝石。 (5认同)

Cra*_*ger 19

公用表表达式允许您显式指定别名,不仅针对 CTE,还针对其列。

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

这与@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);
Run Code Online (Sandbox Code Playgroud)

这不能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);
Run Code Online (Sandbox Code Playgroud)


小智 16

您可以使用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;
Run Code Online (Sandbox Code Playgroud)


dez*_*zso 10

你可以这样做:

WITH r AS (
  SELECT 'bla' AS name1, 'otherbla' AS name2
)
SELECT row_to_json(r.*)
FROM r
;
Run Code Online (Sandbox Code Playgroud)

(当然,同样可以通过

SELECT row_to_json(r.*)
FROM (SELECT 'bla' AS name1, 'otherbla' AS name2) r
;
Run Code Online (Sandbox Code Playgroud)

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

WITH零件中,您可以即时构建任何结构的行。