名称冲突时如何在列上更喜欢表名(在postgres中)

时间:2017-04-12 16:41:27

标签: postgresql

Postgres允许

select row_to_json(table_name) from table_name;

为表中的每条记录提供json映射。

但是如果表中有一个与表名相同的列,由于最不知道只有语言设计者知道的原因,postgres更喜欢列名,而不是表名,并且抱怨row_to_json的参数是错误的输入(不是记录)。

有没有办法说这个名字应该引用一个表,而不是列?

(他们的选择有点烦人,因为如果表名具有更高的可见性,我们可以使用tablename.columnname消除歧义。)

2 个答案:

答案 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;