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 楼
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
评论
这个答案是一颗宝石。
–蒂芬
16-3-22在3:34
非常感谢您节省了我的下午时间,很可惜,这不是PostgreSQL API中引用的示例。我知道有可能
– jlandercy
16年4月28日在13:31
#2 楼
公用表表达式使您不仅可以为CTE,而且还可以为列指定别名。WITH data(col1,col2,cola,colb) AS (
VALUES (1,2,'fred','bob')
)
SELECT row_to_json(data) FROM data;
这与@dezso的示例不同,因为它不会t对
col AS alias
列表中的每个列使用SELECT
; 我已经使用
VALUES
表达式作为子查询,但是您可以随意使用SELECT
;关键是,通过指定列名列表,可以在CTE定义中覆盖子查询中提供或假定的任何列别名。再次可以在子查询中执行相同的操作而不是使用
AS alias
:SELECT row_to_json(data)
FROM (VALUES (1,2,'fred','bob')) data(col1,col2,cola,colb);
这不适用于
ROW
表达式;您只能将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-10-27 17:43
@dezso不,我可能应该发表评论。抱歉。
–克雷格·林格(Craig Ringer)
2012年10月28日在0:28
我认为可以。我什至赞成您的答案b / c,其中包含有用的信息,而我的却没有。
– dezso
2012年10月28日在8:08
是否存在用于动态获取列别名的语法?我从一个EAV(实体属性值)模式中提取,在该模式中,还从attribute.name列中选择了所需的键名。
–克里斯
15年3月1日在18:42
@Chris您将需要9.4中更复杂的json函数。
–克雷格·林格(Craig Ringer)
15年3月1日在21:39
#3 楼
您可以使用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;
评论
谢了,兄弟!最佳解决方案:D
– Karanalpe
20年8月12日在14:40
#4 楼
您可以执行以下操作: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 :: :: select row_to_json(r。*)FROM(SELECT c1,c2 :: jsonb FROM us_ca_monterey_aoc.test)连接为非jsonb作为r
–安德鲁·斯科特·埃文斯(Andrew Scott Evans)
16年5月25日在17:27
评论
另外,请参阅:参考1和参考2,以获取类似的Anatoly Ressin的答案可能是一个很好的答案。