2017-04-12 76 views
1

Postgres允许如何通过列宁愿表名时名字冲突(从Postgres)

select row_to_json(table_name) from table_name; 

它提供了在表中的每个记录一个JSON地图。

但是,如果表中有与表格名称相同的列,由于最好只留给语言设计者知道,postgres更喜欢列名,而不是表名,并且抱怨参数row_to_json是错误的类型(不是记录)。

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

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

回答

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 
+0

根据手册,你不需要围绕'table_name的双支架*',因为这ISN”从技术上讲是一个行构造函数,只是一种特殊的语法。 – IMSoP

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; 
+0

row_to_json(table_name)似乎对表名是有效的 - 由于名称冲突,它只是一个问题。 – user48956

+0

@ user48956是的,我理解这个问题,并且这个语法为这个问题提供了一个解决方案。实际上我发现了一个更好的手册页,它直接指向你的情况,所以我已经编辑了我的答案。 – IMSoP