Postgres允许
select row_to_json(table_name) from table_name;
为表中的每条记录提供json映射。
但是如果表中有一个与表名相同的列,由于最不知道只有语言设计者知道的原因,postgres更喜欢列名,而不是表名,并且抱怨row_to_json的参数是错误的输入(不是记录)。
有没有办法说这个名字应该引用一个表,而不是列?
(他们的选择有点烦人,因为如果表名具有更高的可见性,我们可以使用tablename.columnname消除歧义。)
答案 0 :(得分:3)
select row_to_json(t)
from table_name t
或
select row_to_json(table_name.*)
from table_name
请注意,虽然上面会将实际的表列作为键名返回,但row
结构不会创建匿名记录类型,如下所示:
select row_to_json(row(table_name.*))
from table_name
答案 1 :(得分:1)
这种情况实际上是discussed in the manual under the heading "Using Composite Types in Queries"。
但请注意,简单名称与表名前的列名匹配,因此此示例仅适用于查询表中没有名为c的列。
解决方案是table_name.*
会在各种上下文中自动展开,就像在普通SELECT
查询中一样。本手册给出了一个使用函数的明确示例:
例如,如果somefunc()接受复合值参数,则这些查询是相同的:
SELECT somefunc(c.*) FROM inventory_item c;
SELECT somefunc(c) FROM inventory_item c;
接着说:
特别是,解析器会考虑c。*中的c来引用表名或别名,而不是列名,这样就没有歧义;而没有。*,不清楚c是表示表名还是列名,实际上如果有一个名为c的列,则首选列名解释。
简而言之,解决问题的方法是写下这个:
select row_to_json(table_name.*) from table_name;