魔法列“名称”从何而来?

heg*_*mon 11 postgresql database-design postgresql-9.0

我偶然得到了这个:

db=> select name from site;
ERROR:  column "name" does not exist
LINE 1: select name from site;
               ^
db=> select site.name from site;
     name
---------------
 (1,mysitename)
(1 row)
Run Code Online (Sandbox Code Playgroud)

第二个查询返回一个包含整行的元组。使用 postgres 9.0.1。

编辑:按请求定义站点。我真的不重要,这个怪癖适用于任何桌子。

db=> \d site
                         Table "public.site"
 Column |  Type   |                     Modifiers
--------+---------+---------------------------------------------------
 id     | integer | not null default nextval('site_id_seq'::regclass)
 title  | text    | not null
Run Code Online (Sandbox Code Playgroud)

Gai*_*ius 11

NAME实际上是一个函数。Postgres 的一个怪癖是带有一个参数的函数 egfunction(arg)也可以被称为 as arg.function。从文档:

功能符号和属性符号之间的等价性使得在复合类型上使用函数来模拟“计算字段”成为可能。

NAME对象名称内部类型,此函数将其参数转换为该类型并返回它。

  • 更准确地说,`row` 类型被转换为`text`,因为这是函数`name` 的输入类型。然后 `name` 函数将输入字符串转换(不强制转换)为类型 `name`(这也会产生截断为 64 字节的副作用) (2认同)